【问题标题】:Multi-threading the formatting of datagridview rows?多线程格式化datagridview行?
【发布时间】:2023-03-28 03:16:01
【问题描述】:

我已经阅读了一些关于使用 BackgroundWorker 对象来处理执行时间密集型任务的示例,这些任务会生成用于填充 DataGridView 的结果。然而,在我的情况下,似乎填充 DataGridView 的行为是花费最多时间的行为。我想知道这是否是因为我需要格式化结果(隐藏某些列,检查每行上的某些标志以设置颜色/字体等)。

例子:

DataTable results_table;
DataGridView my_grid;
DataView my_view;

private void fillTable()
{
    // Generate the results
    ...


    // Bind the data.
    my_view.Table = results_table;
    my_grid.DataSource = my_view


    // Format the results
    my_grid.Columns[0].Visible = false;
    my_grid.Columns[1].Visible = false;

    my_grid.Columns[2].AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;
    my_grid.Columns[3].AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill;

    foreach (DataGridViewRow row in my_grid.Rows)
    {
        // Check for flags and format necessary rows.
    }
}

这是执行此操作的正确方法,还是有其他方法可以格式化结果而不必遍历每一行?

【问题讨论】:

    标签: c# .net winforms multithreading datagridview


    【解决方案1】:

    您实际上不能在另一个线程中进行格式化,因为所有处理 UI 元素的操作都必须在 UI 线程上进行。您能做的最好的事情就是预先进行处理和决策,以便实际与 GUI 交互的代码尽可能简单和精简。

    【讨论】:

    • 正如 Fredrik 指出的那样,使用“AutoSizeMode”属性(特别是当它设置为“AllCells”时)会导致最大的延迟。现在所有列都设置为“填充”,即使使用逐行格式(粗体、下划线等),对性能的影响也不那么显着。
    【解决方案2】:

    我认为多线程不会帮助您,因为无论如何与控件的任何交互都需要在 GUI 线程上进行(正如 Adam 指出的那样)。

    上次我使用DataGridView 时,我发现我最大的性能瓶颈是AutoSizeMode 的使用。不记得是不是某个特定的值特别糟糕,但确实有点不同。我会从该属性开始试验。

    【讨论】:

      【解决方案3】:

      我不记得 .NET 是否可以在您对表单控件进行大量更改时暂停屏幕更新。如果是这样,那可能会加快您的 UI 更改。

      【讨论】:

        【解决方案4】:

        正如大家所提到的,您只能从 GUI 线程更新您的 UI。但是,您可以将创建my_view 的代码移到单独的线程上。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-08-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多