二〇一八年十一月十日 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