これは、カスタム セル ペインティングを使用して実際に行うのは非常に簡単です。
あなたがする必要があるのは、DataGridView
CellPainting
イベントを処理することだけです:
dataGridView1.CellPainting += new DataGridViewCellPaintingEventHandler(dataGridView1_CellPainting);
そして、ハンドラーで次のようにします。
void dataGridView1_CellPainting(object sender, DataGridViewCellPaintingEventArgs e)
{
if (e.RowIndex == -1)
{
e.Paint(e.CellBounds, DataGridViewPaintParts.All &~DataGridViewPaintParts.ContentBackground);
e.Handled = true;
}
}
上記のコードは非常に単純です。現在のセルがヘッダー行 (インデックスが -1) にあるかどうかを確認し、ContentBackground
.
Windows 7 マシンでのみこれを確認しましたが、問題ないように見えます。コンテンツの背景はソート グリフにのみ使用されているようです。実行する必要がないことを確認するために、ターゲット環境でテストすることをお勧めします。グリフなしで ContentBackground を保持するためのカスタム ペイントが必要になりました。
ヘッダー セルの幅には、グリフのスペースが含まれます。これを変更すると少し面倒になるので、一般的には受け入れますが、幅をテキストに合わせる必要がある場合は、次のようなものが機能します。
DataBindingComplete
最初に次の場合に幅を設定しDataGridView
ます。
void dataGridView1_DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e)
{
if (dataGridView1.AutoSizeColumnsMode == DataGridViewAutoSizeColumnsMode.AllCells)
{
// Loop over all the columns
foreach (DataGridViewColumn c in dataGridView1.Columns)
{
// Work out the size of the header text
Size s = TextRenderer.MeasureText(c.HeaderText, dataGridView1.Font);
// Change the autosize mode to allow us to see if the header cell has the
// longest text
c.AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCellsExceptHeader;
if (s.Width + 10 > c.Width)
{
// If the header cell is longest we set the column width
c.AutoSizeMode = DataGridViewAutoSizeColumnMode.None;
c.Width = s.Width + 10;
}
else
{
// If the header cell is not longest, reset the autosize mode
c.AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells;
}
}
}
}
それが完了したら、セル テキストがヘッダーよりも長い場合でも、列の自動サイズ調整を許可する必要があります。
そのために私はCellValueChanged
イベントを使用しました:
void dataGridView1_CellValueChanged(object sender, DataGridViewCellEventArgs e)
{
DataGridViewColumn c = dataGridView1.Columns[e.ColumnIndex];
if (c.AutoSizeMode == DataGridViewAutoSizeColumnMode.None)
{
Size s = TextRenderer.MeasureText(dataGridView1[e.ColumnIndex, e.RowIndex].Value.ToString(), dataGridView1.Font);
if (s.Width > c.Width)
{
c.AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCellsExceptHeader;
}
}
}