【发布时间】:2020-06-12 19:45:59
【问题描述】:
经典Windows窗体类型的界面,我有两个ListView,一个在左边(SongsAvailable),一个在右边(SongsInLibrary)。在左侧列表中选择一个条目,单击一个按钮将其添加到右侧列表中,但将其放在右侧组中(如果存在)。我有这个代码
private void AddSelected(Object sender, EventArgs e)
{
bool rc = false;
foreach (ListViewItem item in SongsAvailable.SelectedItems)
{
var s = item.SubItems[0].Text.Substring(0, 1);
TestGroup = new ListViewGroup(s, s);
rc = SongsInLibrary.Groups.Contains(TestGroup);
if (!rc) { // create a new group and add it }
SongsInLibrary.Items.Add(new ListViewItem(new[] { item.SubItems[0].Text, item.SubItems[1].Text, item.SubItems[2].Text, item.SubItems[3].Text }, ListGroup ));
}
}
return rc 始终为 false(这并不让我感到惊讶,新的 ListViewGroup 不能已经存在于 Groups 集合中)所以我总是添加新的组。 “包含”的文档也非常简洁。如果没有遍历所有组,我如何找到 A 组是否已经存在?
【问题讨论】:
-
如果您将
TestGroup设置为等于new ListViewGroup实例,您如何期望它等于某个其他实例(Contains需要返回true)? -
我确实在我的问题中提到了它。
-
我不清楚您是如何发现需要搜索的组(
s应该代表什么?),但从the documentation 看来,ListViewGroupCollection类(这是SongsInLibrary.Groups的类型)实现IList,因此您应该能够遍历项目以使用普通循环找到您想要的项目。你试过吗? -
例如,我有一首以字母“A”开头的歌曲。我想把它放在“A”组中。所以是的,我可以在 lvm.groups 中执行类似(伪代码)foreach 组的操作,如果 group.name.equals("A"),则使用该组添加项目。如果我浏览了所有组但没有找到“A”,则添加一个新组并使用该组添加项目(结束伪代码)。但这似乎非常低效,而且绝对不雅。
标签: c# winforms collections