我在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及以上)
答案 0 :(得分:5)
Better ListView可以做到这一点。有一个 ShowEmptyGroups 属性可以解决这个问题:
还有一个 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.Add
和listView.Groups.Add
方法相反。要记住的一件事是,您不需要将项目分配给组,而只需将组分配给项目。这使得您可以通过更改引用来在组之间切换项目,而不必在组之间删除/添加引用。这也假设您已将ListItemGroup的Header
声明为与Key
相同(换句话说,new ListItemGroup("HeaderText" /*KEY*/, "HeaderText" /*HEADER*/)
。否则,您只需要更改逻辑在AddItem
内引用正确的值(通常为Name
。)
答案 4 :(得分:0)
“今年早些时候我在考虑显示空组时遇到了同样的问题。微软,按设计,没有显示没有任何项目的组名。你要做的是创建/添加一个将空白项目或项目保存到组中的空白项目。如果您有实际数据项要填充该组,则必须记住从该组中删除空/空白项目。“