2012-03-05 117 views
9

我無法在MSDN ListView.Groups Property上找到任何有關空的ListViewGroup將被隱藏的評論。是由設計,還是我錯過了什麼?下面的示例代碼將只顯示「item1」項目的「group 2」。ListView中沒有顯示空的ListViewGroup

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(Vista和向上)

+0

至於我知道,空組只是不顯示。您可以添加一個空白字符串項目來顯示該組。 – nik 2012-03-05 04:11:11

+0

我想你的回答是 – 2012-03-13 02:13:51

+0

正確。空組不顯示。你必須先向他們添加項目。 – 2012-03-13 09:13:30

回答

3

是不可能的由微軟設計。
請看social.msdn.microsoft.com的討論。
不要被標題愚弄。它談論空的團體。

+0

這是正確的。查看ListView的源代碼,所有繪畫和分組都是通過PInvokes完成的,這意味着它不僅僅是重寫ListView的繪製方法的簡單問題。可能有一種方法可以通過使用一些我會發布的「黑客」來實現,但這不太好。 – SPFiredrake 2012-03-12 21:51:43

+1

在這種情況下,我支持微軟的設計決策。我不喜歡打開一個組並且什麼都沒有找到。最好不要展示任何東西。 – Steve 2012-04-08 00:21:34

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); 
} 

另一個警告,不推薦。這是相當多的開銷,並不是真的值得麻煩(海事組織)。但是,嘿,每個人都是。這段代碼完全沒有經過測試,只是把它扔到那裏以防萬一你真的需要這個工作(這永遠不會是這樣,更好地尋找替代品)。最糟糕的部分是Group聲明幾乎只存在於ListItem本身中,這樣你可以很容易地改變組。

最後警告,不推薦。

編輯:我修改了上面的代碼,作爲ListView對象的擴展方法,這樣您就可以直接從方法訪問ListView。無論何時添加一個組,您只需撥打listView.AddGroup,添加一個可用於listView.AddItem方法的項目。這與listView.Items.AddlistView.Groups.Add方法相反。要記住的一件事是,您不需要將項目分配給組,而是隻將組分配給項目。這使得您可以通過更改參考在組之間切換項目,而不必在組之間移除/添加參考。這還假定您已經聲明瞭ListItemGroup的Header是相同Key(換句話說,new ListItemGroup("HeaderText" /*KEY*/, "HeaderText" /*HEADER*/)。否則,你只需要改變內AddItem邏輯引用正確的值(這是Name,通常情況下)。

+0

該代碼如何使用,你有樣品嗎? – walter 2012-03-13 01:57:25

4

Better ListView能做的正是這一點。有一個ShowEmptyGroups屬性,它做的伎倆:

empty group in Better ListView

還有一個更好的快速的ListView,這是免費軟件和支持團體以及。這不是一個ListView的包裝,而是一個完整的重新實施的所有功能,100%的管理和剛纔......好:-)

+0

+1看起來不錯,我試過更好的ListView Express – walter 2012-03-24 00:34:50

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(); 
       } 
      } 
     } 
    } 
}