如果向下滚动列表视图(在“详细信息”模式下),然后调整列表视图的大小,并且在Resize事件或甚至是Layout事件中调整列的大小,则内容会严重损坏。
要重现,请创建一个新的C#项目并将此代码放在其中:
private void Form1_Load(object sender, EventArgs e)
{
ListView lv = new ListView();
lv.Size = ClientSize;
lv.Anchor = AnchorStyles.Bottom | AnchorStyles.Left | AnchorStyles.Right | AnchorStyles.Top;
lv.Columns.Add(new ColumnHeader());
lv.Columns.Add(new ColumnHeader());
lv.View = View.Details;
lv.FullRowSelect = true;
lv.Resize += lv_Resize;
Controls.Add(lv);
string[] s = new string[2];
s[0] = "hrd";
s[1] = "igwegmg";
for (int i = 0; i < 20; i++)
{
lv.Items.Add(new ListViewItem(s));
}
lv_Resize(lv, null);
}
private void lv_Resize(object sender, EventArgs e)
{
ListView lv = (ListView)sender;
lv.Columns[1].Width = lv.ClientSize.Width - lv.Columns[0].Width;
}
运行它,向下滚动列表,调整表单大小以通过向下拖动表单底部来显示所有项目。
将其缩小到滚动条显示的位置,然后变得更糟。 或者不是仅调整大小来最大化并恢复表单。
另请注意,列表视图顶部的空白项目(取决于您滚动了多少),您无法点击它们。要恢复正常,你必须做两件事之一。
重新填充物品(不好 - 我的物品太多而且我的滚动位置丢失了。)
手动如果您将表单调整到弹出滚动条的位置,然后将滚动条滚动到底部,然后将鼠标从滚动条上移开,然后返回滚动条顶部,您将看到滚动条自行调整大小,此时您可以将滚动条拖动到顶部,然后将其拖回正常状态。
如果你RedrawItems
,那么至少你可以再次看到所有项目,但仍然会在顶部找到空白项目。在调整大小/布局事件后调用begininvoke
的函数执行RedrawItems
并不总是有效。
有关此错误的任何想法?我真的不想使用任何其他控件或第三方软件。
答案 0 :(得分:0)
注意到我的应用中的其他ListView未显示错误。找出它是因为他们正在调整Form的Resize事件中的列。
解决方法:不要调整ListView.Resize()中的列,但要在Form.Resize()事件中执行此操作。
我打开这个小小的时候,你们中的一些人已经在研究使用ListView.Resize()
的解决方法