2012-03-05 10 views
9

में नहीं दिखाया जाता रहा है कि खाली ListViewGroup छिपा दिया जाएगा MSDN ListView.Groups Property पर कोई टिप्पणी नहीं पा सके। क्या यह डिजाइन द्वारा है, या मुझे कुछ याद आ रहा है? नीचे मेरा नमूना कोड आइटम "item1" के साथ केवल "समूह 2" दिखाएगा।खाली ListViewGroup ListView

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) _ 
     Handles MyBase.Load 
    ' 
    Dim gr = New ListViewGroup("group 1") 
    ListView1.Groups.Add(gr) 
    ' 
    Dim gr2 = New ListViewGroup("group 2") 
    ListView1.Groups.Add(gr2) 
    ' 
    Dim lvi As New ListViewItem("item1") 
    ListView1.Items.Add(lvi) 
    ' 
    gr2.Items.Add(lvi) 
End Sub 

अपडेट किया गया: है वहाँ के लिए डमी आइटम

जोड़े बिना ListViewGroup दिखाने के लिए किसी भी तरह से कर रहे हैं अब केवल वैकल्पिक हल विचार मेरे पास है collapsible listview (विस्टा और ऊपर) का उपयोग करने के

+0

से पता चलता जहां तक मुझे पता है, खाली समूह बस प्रदर्शित नहीं होते हैं। आप समूह को प्रदर्शित करने के लिए बस एक खाली स्ट्रिंग आइटम जोड़ सकते हैं। – nik

+0

मुझे लगता है कि आपको अपना उत्तर –

+0

सही मिला है। खाली समूह दिखाई नहीं देते हैं। आपको पहले उन्हें आइटम जोड़ना होगा। –

उत्तर

3

संभव नहीं है माइक्रोसॉफ्ट डिजाइन द्वारा। social.msdn.microsoft.com पर इस चर्चा में
देखो।
शीर्षक से मूर्ख मत बनो। यह खाली समूहों के बारे में बात करता है।

+0

यह सही है। ListView के लिए स्रोत कोड को देखते हुए, सभी चित्रकला और समूहिंग PInvokes के माध्यम से की जाती है, जिसका अर्थ है कि यह ListView की ड्रॉ विधि को ओवरराइड करने का एक साधारण मामला नहीं है। एक छोटा सा "हैक" के उपयोग के माध्यम से आप इसे पोस्ट कर सकते हैं, लेकिन यह सुंदर नहीं है। – SPFiredrake

+1

इस मामले में मैं माइक्रोसॉफ्ट डिजाइन निर्णय का समर्थन करता हूं। मैं एक समूह खोलना और अंदर कुछ भी नहीं ढूंढना पसंद करता हूं। कुछ भी बेहतर मत दिखाओ। – Steve

1

हैक मैं ऊपर के बारे में बात कर रहा हूँ अनुशंसित नहीं है। हालांकि, यदि आप वास्तव में खाली समूहों को दिखाना चाहते हैं, तो आप केवल एक अलग उपयोगिता विधि में जोड़ने कोड को प्रतिनिधि देंगे जो जांचता है कि समूह खाली है या नहीं। यदि ऐसा है, तो यह इसे "डिफ़ॉल्ट" समूह में जोड़ता है (इसलिए यह कम से कम दिखाता है) जब तक आप इसमें कोई आइटम नहीं जोड़ते।

public static void AddGroup(this ListView lv, ListViewGroup lg) 
{ 
    if (lg.Items.Count > 0 || lv.Items.Cast<ListViewItem>().Any(tg => tg.Group == lg)) 
     lv.Groups.Add(lg); 
    else 
    { 
     var item = lv.Items.Add(lg.Header); 
     item.Tag = lg; 
    } 
} 

public static void AddItem(this ListView lv, ListViewItem li, string groupKey) // Could also take ListViewGroup here... 
{ 
    if (lv.Groups[groupKey] == null && lv.Items.ContainsKey(groupKey)) 
    { 
     lv.Groups.Add((ListViewGroup)lv.Items[groupKey].Tag); 
     lv.Items.RemoveByKey(groupKey); 
    } 
    lv.Items.Add(li); 
    li.Group = lv.Groups[groupKey]; 
} 

public static void AddItem(this ListView lv, ListViewItem li, ListViewGroup lg) 
{ 
    lv.AddItem(li, lg.Header); 
} 

एक और चेतावनी, अनुशंसित नहीं। यह काफी अधिक है, और वास्तव में परेशानी (आईएमओ) के लायक नहीं है। लेकिन हे, अपने प्रत्येक के लिए। यह कोड पूरी तरह से अनचाहे है, और अगर आपको वास्तव में काम करने की ज़रूरत है तो इसे बाहर फेंक दें (जो कभी भी मामला नहीं होना चाहिए, विकल्प देखने के लिए बेहतर होना चाहिए)। सबसे बुरा हिस्सा यह है कि ग्रुप घोषणापत्र सूची सूची में ही बहुत अधिक रहता है, इस तरह आप समूह को आसानी से बदल सकते हैं।

अंतिम चेतावनी, अनुशंसित नहीं।

संपादित करें: मैं कोड ListView वस्तुओं पर विस्तार तरीकों होने के लिए, इस तरह आप तरीकों से ListView के लिए सीधी पहुँच है संशोधित कर लिया है ऊपर। जब भी आप एक समूह जोड़ने, तो आप सिर्फ listView.AddGroup कहेंगे, एक आइटम आप listView.AddItem तरीकों में से उपयोग कर सकते हैं जोड़ने। यह listView.Items.Add और listView.Groups.Add विधियों का विरोध करता है। ध्यान में रखना एक बात यह है कि आपको समूह को आइटम असाइन करने की आवश्यकता नहीं है, बल्कि इसके बजाय केवल समूह को आइटम असाइन करें। यह ऐसा करता है ताकि आप समूहों के बीच संदर्भों को हटाने/जोड़ने के बजाय, संदर्भ को बदलकर समूहों के बीच वस्तुओं को स्विच कर सकें। यह भी मान लिया आप ListItemGroup की HeaderKey के रूप में ही घोषित किया है कि (दूसरे शब्दों में, new ListItemGroup("HeaderText" /*KEY*/, "HeaderText" /*HEADER*/)। अन्यथा, आप बस AddItem भीतर तर्क को बदलने के लिए उचित मूल्य (जो Name है संदर्भित करने के लिए होगा, आमतौर पर)

+0

इस कोड का उपयोग कैसे किया जा सकता है, क्या आपके पास नमूना है? – walter

0

"मैं खाली समूहों के प्रदर्शन पर विचार करने के इस साल की शुरुआत में एक ही मुद्दे में भाग गया। माइक्रोसॉफ्ट, डिज़ाइन, किसी भी आइटम के खाली समूह समूह को प्रदर्शित नहीं करता है। आपको क्या करना है समूह में टेक्स्ट के रिक्त चरित्र वाले खाली आइटम या आइटम को बनाएं/जोड़ें। जब आपके पास उस समूह के लिए पॉप्युलेट करने के लिए वास्तविक डेटा आइटम है, तो आपको उस समूह से खाली/खाली आइटम को हटाना याद रखना चाहिए। "

स्रोत: http://social.msdn.microsoft.com/forums/en-US/csharpgeneral/thread/39681a70-d992-4046-ad7e-21a2e33791b1

4

Better ListView बिल्कुल यह कर सकता है।

empty group in Better ListView

भी एक बेहतर ListView एक्सप्रेस, जो फ्रीवेयर है और साथ ही समूहों का समर्थन करता है नहीं है: वहाँ एक ShowEmptyGroups संपत्ति है कि चाल करता है। यह एक ListView आवरण है, लेकिन सभी सुविधाओं की पूर्ण फिर से कार्यान्वयन नहीं है, 100% में कामयाब रहे और सिर्फ बनाया ... बेहतर :-)

+0

+1 अच्छा लग रहा है, मैंने बेहतर सूची दृश्य एक्सप्रेस की कोशिश की है – walter

3

इस विधि सुनिश्चित करती है ListViewGroup

void MakeSureListViewGroupHeaderShows(ListView lv) 
{ 
    foreach (ListViewGroup lvg in lv.Groups) 
    { 
     if (lvg.Items.Count == 0) 
     { 
      // add empty list view item 
      ListViewItem lvi = new ListViewItem(string.Empty); 
      lvi.Group = lvg; 
      lv.Items.Add(lvi); 
     } 
     else 
     { 
      // remove our dummy list view item 
      foreach (ListViewItem lvi in lvg.Items) 
      { 
       if (lvi.Text == string.Empty) 
       { 
        lvi.Remove(); 
       } 
      } 
     } 
    } 
}