在我的 DataGridView 中,有一个小刻度线可以帮助用户可视化他们所在的行,但对于他们所在的当前列似乎没有相同类型的刻度线。
1 回答
如果您想要一个实际的 tic 标记,您将需要进行一些自定义绘图,或者操作排序 tic 标记。我不推荐后者,因为现在列标题中的小箭头表示“排序”已成为惯例。
但是,您可以使用标题单元格的格式。在这个(半粗略但有效的)示例中,将标题单元格中的文本更改为粗体以指示当前选定单元格所在的列。当用户通过制表符或简单地单击新单元格来更改单元格时,正确的列标题文本将变为粗体。
显然,还有一些其他的属性需要处理,尽管您可能不得不折腾一段时间试图找到使用 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 方法来进行自己的排水,但这似乎有点极端。试试这段代码,看看headers的外观是不是简直无法忍受。无论如何,这是一个开始!
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;
}
}
}