【问题标题】:Why does changing the HeaderStyle of a ListView hang the application?为什么更改 ListView 的 HeaderStyle 会挂起应用程序?
【发布时间】:2012-02-03 04:13:36
【问题描述】:

我一直在尝试解决这个问题,这似乎是 .Net 框架的问题。无论如何,我有一个包含 5000 多个项目的列表视图和一个用于对列表视图中的选定项目进行进一步处理的按钮。现在单击此按钮还应将列表视图的“listview.HeaderStyle”属性设置为“ColumnHeaderStyle.Nonclickable”。 现在当我这样做的时候。该程序挂起大约 10 秒钟,然后继续其工作。我不知道是什么原因造成的以及为什么会这样。我希望你们对此有解决方案。 有任何想法吗?

【问题讨论】:

  • 这会造成几秒钟的延迟并不让我特别惊讶。每当您设置属性时,框架可能会重新创建本机 ListView 控件,这需要一段时间。值得注意的是,ListView 中有 5000 多个项目...
  • 有什么变通的解决方案吗?

标签: c# .net winforms listview


【解决方案1】:

我现在已经找到了一个基本的解决方案,我所需要的只是设置

myListview.ColumnClick += new ColumnClickEventHandler(delegate{});

现在我不再需要更改“listview.HeaderStyle”属性了。 基本上我是从HeaderStyle 属性中禁用ColumnClick 事件,仅此而已。所以不要将 HeaderStyle 设置为 nonClickable。我只是删除/更改事件处理程序中的函数。

【讨论】:

    【解决方案2】:

    您可以使用BackgroundWorker MSDN 解决此问题。

    注意:即使使用此解决方案,您的表单也会挂起一段时间。因为您有 5000 多个项目要绑定到列表,这将阻塞您的 UI 线程,因此 winform 将挂起。但是你的listview.HeaderStyle 会被修改。

    试试这个

    1. 单击按钮时,您直接将listview.HeaderStyle 的属性更改为ColumnHeaderStyle.Nonclickable。然后拨打RunWorkerAsyncBackgroundWorker
    2. DoWork 事件处理程序上,您进行处理,并在完成后将数据绑定到列表视图。为此,您需要将以下扩展类添加到您的项目中。

    扩展类

    public static class ControlExtensions
    {
        public static void Invoke(this Control control, Action action)
        {
            if (control.InvokeRequired) control.Invoke(new MethodInvoker(action), null);
            else action.Invoke();
        }
    }
    

    使用它可以将数据绑定到列表视图

    listview.Invoke(() => ( listview.DataSource = dataSource; });
    

    希望这对你有用。

    【讨论】:

    • 谢谢你的想法..但它真的没有太大的区别..我只是想到了另一个更简单的解决方案,它可能不会阻止任何东西......它改变了 Columnclick 事件清空函数。
    • 这就是想法,您在后台线程上进行所有计算,并让您的 UI 线程不受它的影响。 UI 线程应该只处理渲染部分,而不是理想情况下的计算。
    猜你喜欢
    • 2014-04-27
    • 1970-01-01
    • 2015-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-17
    • 1970-01-01
    相关资源
    最近更新 更多