4

さまざまな行の高さを設定したい仮想データグリッドビューがあります。一度に 1 つずつループするのではなく、すべての行の高さを一度に設定する方法を見つけたいと思っていました。

これは私が高さを設定しようとした方法ですが、パフォーマンスは1,000行あたり約1秒です。私にとって、平均的な行数は 20,000 ~ 30,000 行であるため、これは受け入れられません。

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サイズを変更するときに呼び出されないようにする方法はありますか?

4

2 に答える 2

3

どうやら、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 行の場合、別の配列を作成しないと 15 秒かかるのに対し、これは 150 ミリ秒しかかからず、100 倍高速です!

于 2012-06-15T16:47:14.783 に答える
1

コードの代わりにこれを試して、パフォーマンスが向上するかどうかを確認してください。通常、仮想グリッドを使用すると、これはより高速に機能します -

のハンドラーを追加しDataGridView.RowPrePaintます。

dataGridView1.RowPrePaint += new DataGridViewRowPrePaintEventHandler(dataGridView1_RowPrePaint);

private void dataGridView1_RowPrePaint(object sender, DataGridViewRowPrePaintEventArgs e)
{
    dataGridView1.AutoResizeRow(e.RowIndex);
}
于 2012-06-15T16:29:59.773 に答える