1. 程式人生 > >C#之ListView開啟虛擬模式,報錯:其他資訊: 處於 VirtualMode 中時,ListView RetrieveVirtualListItem 事件需要每個 ListView 列的列表檢視

C#之ListView開啟虛擬模式,報錯:其他資訊: 處於 VirtualMode 中時,ListView RetrieveVirtualListItem 事件需要每個 ListView 列的列表檢視

二〇一八年十一月十日 21:54:49

1、環境: VS 2010 + C#  + ListView虛擬模式 + winform

2、報錯:

其他資訊: 處於 VirtualMode 中時,ListView RetrieveVirtualListItem 事件需要每個 ListView 列的列表檢視子項。

3、原因:

        滿足 : 【 ListView的初始化設定的列數為A, 新新增一行B,B的列數小於 A 】條件,就會報錯:

其他資訊: 處於 VirtualMode 中時,ListView RetrieveVirtualListItem 事件需要每個 ListView 列的列表檢視子項。

4、解決方案:

    新增行的列數 B 滿足條件: B >= A 即可。

----------------錯誤 示範-----------------------

ListView初始設定的的列數為 8列,如下圖:

現在,新增列,程式碼如下:

 /// add count of rows
                for (int i = 0; i < 200; i++)
                {
                    ListViewItem item = new ListViewItem();

                    /// first column
                    item.SubItems[0].Text = i.ToString();

                    /// and other columns 
                    for (int k = 1; k < 6; k++)
                    {
                        item.SubItems.Add(k.ToString());
                    }
                    _listArrRecv.Add(item);
                }

                listView_recv.VirtualListSize = _listArrRecv.Count;
                listView_recv.Invalidate();

解釋程式碼:第一個for, 增加 200 行, 請注意, 程式碼中 新增 每一行 只有  6 列(item.SubItems[0].Text + 第二個for 迴圈),而listview初始化的列一共有 8 列。    執行程式碼,發現如下提示:

VS 的輸出框也提示:

------- 解決方案,如  第四步。將 新增行 程式碼改為如下(第二個for):

 for (int k = 1; k < 8; k++)

完整增加行示例程式碼:

/// add count of rows
                for (int i = 0; i < 200; i++)
                {
                    ListViewItem item = new ListViewItem();

                    /// first column
                    item.SubItems[0].Text = i.ToString();

                    /// and other columns  
                    for (int k = 1; k < 6; k++)
                    {
                        item.SubItems.Add(k.ToString());
                    }
                    _listArrRecv.Add(item);
                }

                listView_recv.VirtualListSize = _listArrRecv.Count;
                listView_recv.Invalidate();

---------------------- OK