1

e.CellStyle.BackColorDataGridView の CellFormatting イベントを介していくつかの行にスタイリング (たとえば) を適用した場合、後の段階でそのスタイリングを検出することは可能ですか?

たとえば、現在、コードの汎用ブロックを使用して、すべての DataGridView の印刷と Excel へのエクスポートを処理しています。これまで、コードはスタイリングに対応していませんでした。

それで、それを追加したいと思います。

行またはセルのをチェックする.DefaultCellStyleと、スタイリングは表示されません (0 または黒と表示されるだけで、これは完全に間違っています)。

これは、スタイリングを DefaultCellStyle に埋め込むのではなく、CellFormatting イベントを介してスタイルを適用したためだと思います。

4

2 に答える 2

1

残念ながら、私はあなたの問題に対する完全な解決策を見つけることができず、回避策しか見つけられませんでした。

MSDNの例を使用してCellFormattingイベントを実験した結果、表示されているものが正確に表示されました。BackColorこれは明確に設定されていましたが、CellStyleそれを反映していませんでした。1

私が見つけた回避策は、DataGridViewCellFormattingEventArgs CellStyleプロパティを使用せず、代わりにグリッドに直接移動することでした。これには、セルをフォーマットしたくない場合を手動で処理する必要があるという欠点があります。

これを示すいくつかのコードが以下にあります-これもMSDNコードを変更しているだけです:

void dataGridView1_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
{
    // If the column is the Artist column, check the
    // value.
    if (this.dataGridView1.Columns[e.ColumnIndex].Name == "Artist")
    {
        if (e.Value != null)
        {
            // Check for the string "pink" in the cell.
            string stringValue = (string)e.Value;
            stringValue = stringValue.ToLower();
            if ((stringValue.IndexOf("pink") > -1))
            {
                // With the commented line below we cannot access the new style
                //e.CellStyle.BackColor = Color.Pink;                    

                // With this line we can!
                dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex].Style.BackColor = Color.Pink;
            }
            else
            {
                // With the original MSDN code the else block to reset the 
                // cell style was not needed.
                dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex].Style.BackColor = dataGridView1.DefaultCellStyle.BackColor;
            }

        }
    }
}

1.私の理論では、これは、この方法について人々が抱く混乱に似ています。この.Refresh()方法では、DataGridView画面に描かれた長方形と基礎となるデータの2つの非常に異なるビューがあります。長方形を再描画するだけの.Refresh()方法では、データを更新しません。これはそのようなものだと思います。CellFormattingイベントはペイント中にのみフォーマットされ、グリッドスタイル自体には何もしません。

于 2012-05-16T10:21:51.027 に答える
-1

考えられる解決策は、コードの一般的な印刷ブロック (実際の印刷の直前) に2 番目のハンドラーを追加することです。このハンドラーはCellFormattingイベントにアタッチしe.cellstyle、一時ストレージ (セルスタイルの辞書など) にのみ保存する必要があります。

元の cellformatting 中に適用されたすべての cellstyles は、datagridview に関連付けられている特定の cellformatting-events を調整する必要なく、一般的な印刷コードで読み取り可能になります。印刷の最後に、ハンドラーを再び削除できます。

また、DataGridView がすべてのセルに対して CellFormatting イベントを強制的に発生させる方法はありますか?も参照してください。

于 2015-06-24T12:48:29.100 に答える