4

をロードするフォームがありますDataGridViewCellPaintingセルの値に基づいて行に色を付けるイベントを作成しました。CellPaintingの行を繰り返し処理してペイントするのにDatagridview時間がかかりすぎたので、これはより効率的です。

問題点)

  • このCellPaintingイベントは、フォームの読み込みには対応していません。つまり、スクロールまたはクリックするまですべての行が非表示になり、セルの値に基づいて正しく描画されます。
  • 私が気付いたもう 1 つのことは、列ヘッダーが欠落していることです。他の問題はDataGridView、スクロール バーで行を下にスクロールするCellPaintingと、再度呼び出され、行の色が再描画されるまで数秒待たなければならないことです。これは、特に何千行もある場合に非常に煩わしく、スクロールするたびにスクロールが遅延します。

これらの問題はすべてなくなり、メソッドDatagridViewを削除すると列ヘッダーと行がすべて表示されるCellPaintingため、明らかに問題があります。以下は私のスニペットです。助けていただければ幸いです。

private void timeLineDataGridView_CellPainting(object sender, DataGridViewCellPaintingEventArgs e)
        {
        //only bold and/or color the rows that are false
                if ((Boolean)timeLineDataGridView.Rows[e.RowIndex].Cells[12].Value == false)
                {
                    //get timestamp and go ahead and bold it 
                    DateTime eventTime = DateTime.Parse(timeLineDataGridView.Rows[e.RowIndex].Cells["TIMESTAMP"].Value.ToString());
                    timeLineDataGridView.Rows[e.RowIndex].DefaultCellStyle.Font = this.boldFont;


                        if (eventTime < this.delay_warn_time3)
                        {
                            timeLineDataGridView.Rows[e.RowIndex].DefaultCellStyle.BackColor = Color.Red;
                        }
                        else if (eventTime < this.delay_warn_time2)
                        {
                            timeLineDataGridView.Rows[e.RowIndex].DefaultCellStyle.BackColor = Color.Orange;
                        }
                        else if (eventTime < this.delay_warn_time1)
                        {
                            timeLineDataGridView.Rows[e.RowIndex].DefaultCellStyle.BackColor = Color.Yellow;
                        }
                }
        }
4

1 に答える 1

1

代わりにDataGridView.CellFormattingイベントを試してください。セルの内容を表示用に書式設定する必要がある場合に発生します。

この場合、より適切なはずです。

編集

スクロールの問題を除いて、すべての問題を解決したようです。

スクロール時に CellFormatting イベントが発生しないようにするにはどうすればよいですか

メソッドで使用するフラグ (ブール変数) をクラスに追加してDataGridView.CellFormatting、グリッドがスクロールしているかどうかをテストしてから、DataGridView.Scrollこのフラグをマークするイベントを追加できます。

bool _IsScrolling = false;
void DataGridView1_Scroll(object sender, System.Windows.Forms.ScrollEventArgs e)
{
    if (e.Type == ScrollEventType.EndScroll) 
        {
        _IsScrolling = false;
    } else 
        {
        _IsScrolling = true;
    }
}

これは理論的な答えです。試してみてうまくいかない場合 (e.Type決してScrollEventType.EndScroll)、次のことに興味があるでしょう:

于 2013-08-16T20:20:04.123 に答える