簡體   English   中英

ListView.Items.Clear 似乎刪除了組關聯

[英]ListView.Items.Clear seems to remove group association

我偶然發現了以下問題:我正在使用實時過濾 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();

以某種方式更改主列表中的組集合。 我知道這一點是因為我在上面的行上設置了一個斷點並顯示特定項目的主列表組。 執行上述行后,項目的組設置為 null。 這導致列表現在顯示一個“默認”分組,其中包含其組被取消的項目。

我的理解是,有問題的行不應該以任何方式修改 Group 集合。

通過更多的調試,我能夠解決這個問題。 我注意到 Group 屬性還有一個“Items”集合,用於跟蹤分配給該組的項目。 在調試過程中,我注意到項目傾向於重復。 這使我檢查了用於分配項目的代碼。 這就是我發現問題的地方。

在將它們添加到主列表時,我沒有創建項目的新實例。 我正在使用每個項目的副本。 因此,我將該代碼更改為:

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

新代碼確保我獲得了列表視圖項的新實例,而不是副本。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM