WinForms ListView空行故障

时间:2009-11-25 14:00:33

标签: winforms listview

我在WinForms C#ListView中有一个小故障(对所有列进行自定义修改以排序和过滤,但它也发生在标准的ListView中)。

我用这个(相当标准的)模式修改ListView项目:

BeginUpdate();
// add some items
// remove some other items
Sort();
EndUpdate();

但是如果我在ListView已经滚动时调用此代码,那么我会在真实项目之前得到一些空的(不可选择的)行,并且即使不需要它们也会得到2个滚动条。

它看起来像一个图形故障,因为当我滚动列表时,空项目就会消失。

以前有人遇到过这个问题吗?

3 个答案:

答案 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