私のDataGridViewには、ユーザーがどの行にいるのかを視覚化するのに役立つ小さな目盛りがありますが、現在の列には同じ種類の目盛りがないようです。
1 に答える
実際の目盛りが必要な場合は、カスタム描画を行うか、並べ替え目盛りを操作する必要があります。後者はお勧めしません。列ヘッダーの小さな矢印が「並べ替え」を意味するのは今では慣例だからです。
ただし、ヘッダーセルの書式設定を試すことはできます。この(半粗いが効果的な)例では、ヘッダーセルのテキストを太字に変更して、現在選択されているセルが存在する列を示します。ユーザーがタブを押すか、新しいセルをクリックするだけでセルを変更すると、正しい列ヘッダーテキストが太字に変わります。
明らかに、他にもいくつかのプロパティをいじる必要がありますが、styleプロパティを使用する適切な方法を見つけるために、しばらくの間いじくり回さなければならない場合があります。簡単なデモだったので、太字のテキストを使用しました(ただし、プロジェクトでのアプローチ方法でもあります)。
基本的に、それはすべてDataGridViewColumn.HeaderCell.Styleプロパティに帰着します。
以下では、DataGridviewクラスから継承し、イベント処理を使用して、コントロールによってソースされたCellEnterイベント中にヘッダーセルを操作します。
class dgvControl : DataGridView
{
// Keep track of the most recently selected column:
private DataGridViewColumn _currentColumn;
public dgvControl() : base()
{
// Add a handler for the cell enter event:
this.CellEnter += new DataGridViewCellEventHandler(dgvControl_CellEnter);
// When the Control is initialized, instantiate the placeholder
// variable as a new object:
_currentColumn = new DataGridViewColumn();
// In case there are no columns added (for the designer):
if (this.Columns.Count > 0)
{
this.OnColumnFocus(0);
}
}
void dgvControl_CellEnter(object sender, DataGridViewCellEventArgs e)
{
this.OnColumnFocus(e.ColumnIndex);
}
void OnColumnFocus(int ColumnIndex)
{
// If the new cell is in the same column, do nothing:
if (ColumnIndex != _currentColumn.Index)
{
// Set up a custom font to represent the current column:
Font selectedFont = new Font(this.Font, FontStyle.Bold);
// Grab a reference to the current column:
var newColumn = this.Columns[ColumnIndex];
// Change the font to indicate status:
newColumn.HeaderCell.Style.Font = selectedFont;
// Set the font of the previous column back to normal:
_currentColumn.HeaderCell.Style.Font = this.Font;
// Set the current column placeholder to refer to the new column:
_currentColumn = newColumn;
}
}
}
アップデート:
より詳細に制御し、ヘッダーセルの背景色やフォント以外のスタイルプロパティを変更する場合は、EnableHeadersVisualStylesプロパティをfalseに設定する必要があります。以下のコードは、ヘッダーの背景色を操作できるように変更されています。柔軟性を高めることの代償として、ヘッダーの見た目がやや滑らかになりません(ヘッダーが平らになり、わずかなグラデーションがなくなります)。
あなたは本当に野心的で、OnPaintメソッドをオーバーライドして独自のドレインを行うことができますが、それは少し極端に思えます。このコードを試して、ヘッダーの外観が単純に耐えられないかどうかを確認してください。とにかく、それは始まりです!
class dgvControl : DataGridView
{
// Keep track of the most recently selected column:
private DataGridViewColumn _currentColumn;
public dgvControl() : base()
{
this.EnableHeadersVisualStyles = false;
// Add a handler for the cell enter event:
this.CellEnter += new DataGridViewCellEventHandler(dgvControl_CellEnter);
// When the Control is initialized, instantiate the placeholder
// variable as a new object:
_currentColumn = new DataGridViewColumn();
// In case there are no columns added (for the designer):
if (this.Columns.Count > 0)
{
this.OnColumnFocus(0);
}
}
void dgvControl_CellEnter(object sender, DataGridViewCellEventArgs e)
{
this.OnColumnFocus(e.ColumnIndex);
}
void OnColumnFocus(int ColumnIndex)
{
// If the new cell is in the same column, do nothing:
if (ColumnIndex != _currentColumn.Index)
{
// Set up a custom font to represent the current column:
Font selectedFont = new Font(this.Font, FontStyle.Bold);
// Grab a reference to the current column:
var newColumn = this.Columns[ColumnIndex];
// Change the font to indicate status:
newColumn.HeaderCell.Style.Font = selectedFont;
// Change the color to a slightly darker shade of gray:
newColumn.HeaderCell.Style.BackColor = Color.LightGray;
// Set the font of the previous column back to normal:
_currentColumn.HeaderCell.Style.Font = this.Font;
// Change the color of the previous column back to the default:
_currentColumn.HeaderCell.Style.BackColor = Color.Empty;
// Set the current column placeholder to refer to the new column:
_currentColumn = newColumn;
}
}
}