我在WinForms C#ListView中有一个小故障(对所有列进行自定义修改以排序和过滤,但它也发生在标准的ListView中)。
我用这个(相当标准的)模式修改ListView项目:
BeginUpdate();
// add some items
// remove some other items
Sort();
EndUpdate();
但是如果我在ListView已经滚动时调用此代码,那么我会在真实项目之前得到一些空的(不可选择的)行,并且即使不需要它们也会得到2个滚动条。
它看起来像一个图形故障,因为当我滚动列表时,空项目就会消失。
以前有人遇到过这个问题吗?
答案 0 :(得分:1)
好的,我发现了问题。在Resize期间调用设置列Width = -2会弄乱所有者绘制过滤器......
答案 1 :(得分:0)
此ListView图形错误。如果在更改ListView大小时更改其列的宽度,则可以重现类似的问题。作为解决方案,该方法建议在单独的线程中更改宽度。
private void ListView_SizeChanged(object sender, EventArgs e)
{
var widthChangedThread = new Thread(() => SetNewColumnSize()) {IsBackground = true};
widthChangedThread.Start();
}
private void SetNewColumnSize()
{
Invoke(new MethodInvoker(() =>_columnHeader.Width += 10));
}
答案 2 :(得分:0)
此控件的行为很奇怪,但是设置了scrollabe 在调整大小事件中将属性设置为false完全解决了以下问题:
With DirectCast(sender, ListView)
'do not allow scrolling in the resize event
'ortherwise there is a condition where the control
'stop showing the row data
IsScrollEnabled = .Scrollable
.Scrollable = False
ThisColumnHeader = .Columns("colMessage")
If ThisColumnHeader IsNot Nothing Then
.BeginUpdate()
'With .Columns("colMessage")
' .Width = -2
'End With
If .Items.Count > 0 Then
'If MyListDownloadMessage.Count > 0 Then
If ToolStripSerialRxFillDown.Checked Then
.EnsureVisible(.Items.Count - 1)
Else
If .TopItem IsNot Nothing Then
.EnsureVisible(.TopItem.Index)
End If
End If
End If
.EndUpdate()
.Refresh()
End If
.Scrollable = IsScrollEnabled
End With