【问题标题】:WinForms ListView empty rows glitchWinForms ListView 空行故障
【发布时间】:2009-11-25 14:00:33
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

  • 这种晦涩难懂的问题需要一个重现项目来缩小可能的原因。远景:EndUpdate() 已经调用了 Sort(),省略你的调用,看看它是否有所作为。
  • 已经删除了 Sort(),没有区别。我正在用一个小项目进行测试,但我无法重现这个问题,所以我的代码肯定有问题,但我想检查一下是否有人知道这样的故障,非常感谢
  • 11 年过去了,这个错误仍然存​​在于最新的 .NET 中

标签: winforms listview


【解决方案1】:

这个 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】:

    好的,我发现了问题。在调整大小期间设置列 Width = -2 的调用弄乱了所有者绘制过滤器...

    【讨论】:

      【解决方案3】:

      这个控件的行为很奇怪,但是设置了滚动 在 resize 事件中将属性设置为 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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-06-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-06-07
        相关资源
        最近更新 更多