【问题标题】:Setting DataGridView Row Heights Fast快速设置 DataGridView 行高
【发布时间】:2012-06-15 16:25:29
【问题描述】:

我有一个虚拟数据网格视图,我想为其设置不同的行高。我希望找到一种方法来一次设置所有行高,而不是一次循环遍历每一个。

这是我尝试设置高度的方法,但性能非常糟糕,每 1000 行大约 1 秒。对我来说,平均行数约为 20k-30k 行,所以这是不可接受的。

public void PopulateData()
    {
        this.SuspendLayout();

        this.RowCount = Data.RowCount;

        for (int i = 0; i < Data.RowCount; i++)
        {
            this.Rows[i].Height = Data.RowHeights[i];
        }

        this.ResumeLayout();
    }

我也确保先关闭自动调整大小,但性能仍然很差。

this.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.None;
        this.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.None;

有什么方法可以传入行高数组或防止在调整行大小时调用OnRowHeightChanged

【问题讨论】:

    标签: c# winforms datagridview


    【解决方案1】:

    显然,如果您独立于 datagridview 创建行,则性能障碍特性不适用。

    诀窍是创建一个行数组,调整它们的大小,然后将行的范围添加到 datagridview:

    public void PopulateData()
        {
            this.SuspendLayout();
    
            DataGridViewRow[] rows = new DataGridViewRow[Data.RowCount];
            for (int i = 0; i < rows.Length; i++)
            {
                DataGridViewRow row = new DataGridViewRow();
                row.Height = Data.RowHeights[i];
                rows[i] = row;
            }
            this.Rows.AddRange(rows);
    
            this.ResumeLayout();
        }
    

    对于 15,000 行,这只需 150 毫秒,而没有创建单独的数组则需要 15 秒,快 100 倍!

    【讨论】:

      【解决方案2】:

      试试这个而不是你的代码,看看你是否有任何性能提升。通常使用虚拟网格会更快 -

      DataGridView.RowPrePaint添加一个处理程序:

      dataGridView1.RowPrePaint += new DataGridViewRowPrePaintEventHandler(dataGridView1_RowPrePaint);
      
      private void dataGridView1_RowPrePaint(object sender, DataGridViewRowPrePaintEventArgs e)
      {
          dataGridView1.AutoResizeRow(e.RowIndex);
      }
      

      【讨论】:

      • 这样做的问题是滚动条的大小不正确。
      • 在每行调用行预绘制方法之前,网格仍然会认为行都是默认的行模板高度。只有当用户滚动浏览所有行时,才会设置正确的高度并正确滚动网格。
      • AutoSizeRowsMode 设置为什么?
      猜你喜欢
      • 2017-02-20
      • 1970-01-01
      • 1970-01-01
      • 2023-03-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-14
      • 1970-01-01
      相关资源
      最近更新 更多