ListView中未显示空ListViewGroup

时间:2012-03-05 03:33:00

标签: c# .net vb.net winforms listview

我在MSDN ListView.Groups Property上找不到任何会隐藏空ListViewGroup的评论。是设计还是我遗失了什么?我的示例代码仅显示"第2组" with item" item1"。

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及以上)

5 个答案:

答案 0 :(得分:5)

Better ListView可以做到这一点。有一个 ShowEmptyGroups 属性可以解决这个问题:

empty group in Better ListView

还有一个 Better ListView Express ,它是免费软件,也支持群组。它不是ListView包装器,而是完全重新实现所有功能,100%管理并且刚刚制作...更好: - )

答案 1 :(得分:4)

微软的设计是不可能的 请看social.msdn.microsoft.com上的讨论 不要被标题所迷惑。它谈论空组。

答案 2 :(得分: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();
                }
            }
        }
    }
}

答案 3 :(得分: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);
}

另一个警告,不推荐。这是一个相当大的开销,并不值得麻烦(IMO)。但是,嘿,给每个人自己。这段代码是完全未经测试的,只是将它扔到那里以防你真的需要这个工作(绝不应该这样,最好寻找替代品)。最糟糕的是,Group声明几乎只存在于ListItem本身,这样你就可以很容易地改变组。

最后警告,不推荐。

编辑:我已将上面的代码修改为ListView对象的扩展方法,这样您就可以从方法直接访问ListView。无论何时添加群组,您只需致电listView.AddGroup,添加可以使用listView.AddItem方法的项目。这与listView.Items.AddlistView.Groups.Add方法相反。要记住的一件事是,您不需要将项目分配给组,而只需将组分配给项目。这使得您可以通过更改引用来在组之间切换项目,而不必在组之间删除/添加引用。这也假设您已将ListItemGroup的Header声明为与Key相同(换句话说,new ListItemGroup("HeaderText" /*KEY*/, "HeaderText" /*HEADER*/)。否则,您只需要更改逻辑在AddItem内引用正确的值(通常为Name。)

答案 4 :(得分:0)

“今年早些时候我在考虑显示空组时遇到了同样的问题。微软,按设计,没有显示没有任何项目的组名。你要做的是创建/添加一个将空白项目或项目保存到组中的空白项目。如果您有实际数据项要填充该组,则必须记住从该组中删除空/空白项目。“

来源:http://social.msdn.microsoft.com/forums/en-US/csharpgeneral/thread/39681a70-d992-4046-ad7e-21a2e33791b1