2013-08-17 3 views
7

खैर मैं एक विंडोज़ रूपों आवेदन जिसमें मैं आदेश उपयोगकर्ता के लिए कुछ डेटा रखने के लिए में listviews के एक जोड़े को जोड़ने के लिए है और यह इसबदलने ListView शीर्ष लेख और ग्रिड लाइन रंग

enter image description here

आप के रूप में की तरह दिखता है देखें कि मेरा फॉर्म बैककलर काला है इसलिए सूची दृश्य की ग्रिड लाइनें और हेडर व्हाइट रंग एक कष्टप्रद विपरीत बनाता है, इसलिए बिना किसी किस्मत के एक घंटे के खोज के बाद मैंने यहां पूछने का फैसला किया।

[प्रश्न]: मैं हेडर & मेरी आवश्यकताओं से मेल खाने के लिए सूची दृश्य की ग्रिड लाइन्स के रंग कैसे संपादित कर सकता हूं?

+1

शायद यह? http://stackoverflow.com/questions/1814692/change-the-background-color-of-winform-listview-headers – RenniePet

+0

या यह? http://stackoverflow.com/questions/6008226/are-there-any-good-and-free-devexpress-data-grid-alternatives-for-winforms – RenniePet

+1

@RenniePet: क्षमा करें लेकिन क्या आप देख सकते हैं कि दोनों विषय आपने प्रदान किया मेरे प्रश्न से बहुत दूर हैं? एक धोखेबाज के लिए और दूसरा केवल हेडर रंग की समस्या हल करता है, उन ग्रिड लाइनों के बारे में क्या? –

उत्तर

-1

आप इसे डेटाग्रिड में कर सकते हैं, लेकिन मुझे नहीं लगता कि ListView के लिए एक आसान तरीका है, क्योंकि डेटाग्रिड के विपरीत उन पंक्तियों के लिए कोई गुण नहीं है।

<Style TargetType="{x:Type DataGrid}"> 
    <Setter Property="HorizontalGridLinesBrush" Value="Red"/> 
    <Setter Property="VerticalGridLinesBrush" Value="Green"/> 
</Style> 

इसे एप्लिकेशन संसाधनों या विंडो संसाधनों में रखें।

उसके अलावा, वहाँ एक रास्ता प्रत्येक ListViewItem की सीमा रंग बदल सकते हैं:

<Style TargetType="{x:Type ListViewItem}"> 
    <Setter Property="BorderBrush" Value="Red"/> 
</Style> 
+0

ग्रिडलाइन संपत्ति केवल यह निर्धारित करने के लिए है कि वे दृश्यमान हैं या नहीं ... हालांकि यह किसी भी रंग समायोजन विकल्प प्रदान नहीं करता है जिसकी मुझे सबसे अधिक आवश्यकता है। –

+0

@Nobbacode बाकी चीजें अच्छी हैं हालांकि यह मेरी सबसे बड़ी समस्या को हल नहीं करती है जो ग्रिड लाइनों का रंग है –

+0

@DanialEugen आप डिफ़ॉल्ट वर्ग के साथ ऐसा नहीं कर सकते हैं जब तक आप कुछ चीजों को ओवरराइड नहीं करते (इसे देखें): http : //www.hightechtalks.com/dotnet-framework-winforms-controls/color-grid-listview-539463.html (द्वितीय पोस्ट)। आप ग्रिड व्यू पर भी विचार कर सकते हैं: http://stackoverflow.com/questions/461404/c-sharp-how-do-i-change-the-gridlines-color-in-windows-forms-listview –

6

ऐसा लगता है कि ऐसा कोई है जो एक ListView अनुरूपण Grid Line Color समर्थन करने के लिए में रुचि है नहीं है की तरह है कि। मैंने यह कोशिश की है और यहां साझा करना चाहता हूं। जब आप ListView आइटम स्क्रॉल करते हैं तो यह थोड़ा झिलमिलाहट (वास्तव में बहुत अधिक नहीं) द्वारा वास्तव में अच्छा नहीं है। हालांकि यह स्वीकार्य है। मुझे लगता है मैं win32 यहाँ के कुछ ज्ञान की कमी है इसे और अधिक सही बनाने के लिए:

public class CustomListView : ListView { 
     bool scrollDown; 
     int lastScroll; 
     public Color GridLinesColor {get;set;} 
     [DllImport("user32")] 
     private static extern int GetScrollPos(IntPtr hwnd, int nBar); 
     public CustomListView(){ 
      GridLinesColor = Color.Red; 
      DoubleBuffered = true; 
      base.GridLines = false;//We should prevent the default drawing of gridlines. 
     } 
     public new bool GridLines {get;set;} 
     protected override void WndProc(ref Message m) 
     {     
      if (m.Msg == 0x20a){//WM_MOUSEWHEEL = 0x20a 
       scrollDown = (m.WParam.ToInt64() >> 16) < 0; 
      } 
      if (m.Msg == 0x115){//WM_VSCROLL = 0x115 
       int n = (m.WParam.ToInt32() >> 16); 
       scrollDown = n > lastScroll; 
       lastScroll = n; 
      }     
      base.WndProc(ref m); 
      if (m.Msg == 0xf && GridLines && Items.Count > 0&&View==View.Details)//WM_PAINT = 0xf 
      {      
       using (Graphics g = CreateGraphics()) 
       { 
        using(Pen p = new Pen(GridLinesColor)){ 
         int w = -GetScrollPos(Handle, 0); 
         for (int i = 0; i < Columns.Count; i++) 
         { 
         w += Columns[i].Width; 
         g.DrawLine(p, new Point(w, 0), new Point(w, ClientSize.Height)); 
         } 
         int a = Items[0].Bounds.Bottom - 1; 
         int b = Height - Items[0].Bounds.Y; 
         int c = Items[0].Bounds.Height; 
         for (int i = scrollDown ? a + (b/c) * c : a ; scrollDown ? i >= a : i < b ; i += scrollDown ? -c : c) 
         { 
         g.DrawLine(p, new Point(0, i), new Point(ClientSize.Width, i)); 
         }          
        }   
       }     
      } 

     } 
} 

अद्यतन: कोड़ी ग्रे के सुझाव के लिए धन्यवाद, मैं क्षैतिज स्क्रॉल को संभालने के लिए कोड जोड़ा। मैं सादगी के लिए GetScrollPos का उपयोग करता हूं क्योंकि एमएसडीएन दस्तावेज़ीकरण पृष्ठ द्वारा अनुशंसित अनुसार, हमें इसके बजाय GetScrollInfo का उपयोग करना चाहिए।

enter image description here

+0

+1 मदद करें, यहां तक ​​कि बेकार जवाब पहले ही स्वीकार कर लिया गया था। मैं इसे अपने WinForms वीएम (Win 7, एरो के साथ और बिना) पर झिलमिलाहट नहीं कर सकता। लेकिन कोड के साथ कुछ और बड़ी समस्याएं हैं। उनमें से एक क्षैतिज स्क्रॉलिंग है-जो लागू नहीं किया गया है और परिणामस्वरूप प्रभाव बदसूरत है।इसके अलावा, आप निपटान कॉल करने में विफल होने के द्वारा पेन ऑब्जेक्ट्स लीक कर रहे हैं। सृजन को एक प्रयोग कथन में लपेटकर, आप उसी पेन ऑब्जेक्ट का पुनः उपयोग भी कर सकते हैं * और * इसे स्वचालित रूप से निपटाया गया है। और मुझे समझ में नहीं आता कि आपको 'स्क्रॉलडाउन' स्थिति को ट्रैक करने की आवश्यकता क्यों है। –

+0

@CodyGray आपके सुझाव के लिए धन्यवाद, वास्तव में यह सिर्फ डेमो है। 'स्क्रॉलडाउन' की आवश्यकता है ताकि हम जान सकें कि उपयोगकर्ता स्क्रॉल करता है, तो हम' नीचे 'से' टॉप' 'तक' लाइन्स 'खींचेंगे, अन्यथा (स्क्रॉल अप) हम 'शीर्ष' से' लाइन्स 'खींचेंगे 'Bottom'। यह थोड़ा झिलमिलाहट कम करता है (वास्तव में यह झिलमिलाहट नहीं है, यह डिफ़ॉल्ट 'सफेद रेखाओं' के चित्रण के कारण होता है।) –

+1

मैं स्वीकार्य उत्तर को सबसे अच्छा उत्तर देने के लिए बदल सकता हूं बशर्ते उसमें कोई समस्या न हो, हालांकि मैं ऐसा करूँगा अगर कोड भरा हुआ है ताकि भविष्य में कोई भी मेरे धागे से लाभ उठा सके। –

संबंधित मुद्दे