ListView.Items.Clear似乎删除了组关联



我偶然发现了以下问题:我正在使用"在ListView中实时筛选项目"的答案来在LargeIcon视图中创建筛选后的项目列表。我为列表视图定义组:

//  Define the Groups within the listview.                
foreach (CategoryObject category in JManager.jfo.categories)
{
ListViewGroup lvg = new ListViewGroup();
lvg.Header = lvg.Name = category.name;
channellistView.Groups.Add(lvg);
}

我使用以下代码的方法将项目迭代添加到列表视图和主列表中:

lvi.Group = channellistView.Groups[CategoryName];
lvi.Tag = Obj;
channellistView.Items.Add(lvi);
ListViewItem mlvi = lvi.Clone() as ListViewItem;
mlvi.Group = channellistView.Groups[CategoryName];
masterChannelList.Add(mlvi);

这是当我在"过滤器"文本框中键入字母时处理过滤的代码:

channellistView.BeginUpdate();
channellistView.Items.Clear();
// This filters and adds your filtered items to listView
foreach (ListViewItem item in masterChannelList.Where(lvi => 
lvi.Text.ToLower().StartsWith(searchmetroTextBox.Text.ToLower().Trim())))
{
channellistView.Items.Add(item);
}
channellistView.EndUpdate();

问题发生在我键入字符串的第二个字母之后。看起来这条线:

channellistView.Items.Clear();

以某种方式更改了主列表中的Groups集合。我之所以知道这一点,是因为我在上面一行设置了一个断点,并显示了特定项目的主列表组。在执行上面的行之后,项目的组被设置为null。这导致列表现在显示一个"0";默认";与组被取消的项目进行分组。

我的理解是,有问题的行不应该以任何方式修改Group集合。

通过更多的调试,我能够解决这个问题。我注意到,该集团的财产也有一个";项目";用于跟踪分配给组的项目的集合。在调试过程中,我注意到这些项目往往重复。这让我检查了用于分配项目的代码。这就是我发现问题的地方。

在将这些项添加到主列表时,我没有创建它们的新实例。我用的是每个项目的副本。所以,我把代码改成:

ListViewItem mlvi = new ListViewItem();
mlvi.Text = Obj.title;
mlvi.ImageIndex = 1;
mlvi.Group = channellistView.Groups[CategoryName];
mlvi.Tag = Obj;
masterChannelList.Add(mlvi);

此外,我需要将过滤结果的代码更改为:

// This filters and adds your filtered items to listView
foreach (ListViewItem item in masterChannelList.Where(lvi => lvi.Text.ToLower().StartsWith(searchmetroTextBox.Text.ToLower().Trim())))
{
ListViewItem filteredItem = new ListViewItem();
filteredItem.Text = item.Text;
filteredItem.Group = item.Group;
filteredItem.ImageIndex = item.ImageIndex;
channellistView.Items.Add(filteredItem);
}

新代码确保我得到的是listview项的新实例,而不是副本。

最新更新