2009-06-26 23 views
5

मेरे सूची दृश्य विवरण में सेटअप है निम्न कॉलम हैडर के साथ देखने:ListView में एक सब आइटम के लिए एक छवि आकर्षित

छवि नाम || छवि स्थान || छवि आकार || छवि पूर्वावलोकन

मैं जानना चाहता हूं कि वहां चौथे कॉलम में कोई छवि खींचने का कोई तरीका है या नहीं। एक ही रास्ता मैं जानता हूँ कि,

this.listview1.OwnerDraw = true 
this.listView1.DrawColumnHeader += new System.Windows.Forms.DrawListViewColumnHeaderEventHandler(listView1_DrawColumnHeader); 
this.listView1.DrawItem += new System.Windows.Forms.DrawListViewItemEventHandler(listView1_DrawItem); 
this.listView1.DrawSubItem += new System.Windows.Forms.DrawListViewSubItemEventHandler(listView1_DrawSubItem); 

इस के साथ समस्या यह मैं अपने आप को ड्राइंग सभी सूचीदृश्य को संभालने के लिए है ... स्थापित करने के लिए अगर वहाँ एक सब आइटम के लिए छवि में आकर्षित करने के लिए एक बेहतर तरीका है मैं सोच रहा था है , या यदि DrawSubItem ईवेंट को केवल संभालने का कोई तरीका है?

+0

मैं आकर्षित करने के लिए की जरूरत नहीं है कॉलम हैडर या आइटम ड्रा ... केवल SubItem। लेकिन जब मैंने मालिक ड्रा = सही सेट किया, तो मुझे सभी को आकर्षित करने के लिए मजबूर किया गया 3. क्या सबइटेम को आकर्षित करने का कोई तरीका है? –

उत्तर

0

listView1_DrawColumnHeader में और listView1_DrawItem ईवेंट हैंडलर्स आप इस

e.DrawDefault = true; 

यह के लिए कार्यान्वयन ड्राइंग डिफ़ॉल्ट उपयोग करेगा रखना चाहिए:

कोड की कुछ लाइनों के साथ

, यह आपके ListView कैसे दिखाई देते हैं सकता है कॉलम और आइटम, आपको केवल उप-उपनिवेशों के लिए अपना स्वयं का कार्यान्वयन लिखना है।

2

ObjectListView (एक .NET WinForms ListView के आस-पास एक ओपन सोर्स रैपर) सभी मालिकों को स्वयं को चित्रित किए बिना कॉलम में छवियों को चित्रित करने का समर्थन करता है। डेमो का डेटा टैब एनिमेटेड जीआईएफ दिखाता है, जो थोड़ा ओटीटी है लेकिन यह स्थिर छवियों के साथ समान रूप से अच्छी तरह से काम करेगा। alt text http://objectlistview.sourceforge.net/cs/_images/fancy-screenshot.png

6

मैं बस इसमें भाग गया।

@zidane's answer लगभग सही है। मैं वास्तव में जो करना चाहता हूं उसे पोस्ट करना चाहता हूं ताकि बाद में पढ़ने वाले लोगों को खुद को समझना पड़े।


केवल संभाल DrawColumnHeadere.DrawDefault = true; और सबआइटम ड्राइंग का उपयोग कर। वास्तव में, यदि आप DrawItem ईवेंट में e.DrawDefault = true; सेट करते हैं, तो DrawSubItem ईवेंट कभी भी इस बात पर आग लगती है कि आप पूरी पंक्ति को आकर्षित करना चाहते हैं और सबिटैम की परवाह नहीं करते हैं।

केवल वास्तविक कोड DrawSubItem में है, इस बुनियादी निर्माण का उपयोग:

if (/* condition to determine if you want to draw this subitem */) 
{ 
    // Draw it 
} 
else 
    e.DrawDefault = true; 
0

पिछले जवाब पर काम करते हुए, यहाँ एक पूर्ण VB.NET उदाहरण है:

Public Class MyListView : Inherits System.Windows.Forms.ListView 

Public Sub New() 
    MyBase.New() 
    MyBase.OwnerDraw = True 
End Sub 

Protected Overrides Sub OnDrawSubItem(ByVal e As DrawListViewSubItemEventArgs) 
    If x Then ' condition to determine if you want to draw this subitem 
     ' draw code goes here 
    Else 
     e.DrawDefault = True 
    End If 
    MyBase.OnDrawSubItem(e) 
End Sub 

Protected Overrides Sub OnDrawColumnHeader(ByVal e As DrawListViewColumnHeaderEventArgs) 
    e.DrawDefault = True 
    MyBase.OnDrawColumnHeader(e) 
End Sub 

Protected Overrides Sub OnDrawItem(e As System.Windows.Forms.DrawListViewItemEventArgs) 
    e.DrawDefault = True 
    MyBase.OnDrawItem(e) 
End Sub 

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