在我的DataGridView中,有一个小刻度标记,可帮助用户查看它们所在的行,但它们所在的当前列似乎没有相同类型的刻度线。
答案 0 :(得分:0)
如果你想要一个实际的标记,你需要做一些自定义绘图,或者操纵排序标记。我不推荐后者,因为现在是一个惯例,列标题中的小箭头意味着“排序”。
但是,您可以使用标题单元格的格式。在此(半粗略但有效)示例中,将标题单元格中的文本更改为粗体以指示当前所选单元格所在的列。当用户通过Tab键更改单元格或只是单击新单元格时,正确的列标题文本将更改为粗体。
显然,还有一些其他属性要搞乱,尽管你可能不得不试图找一些方法来找到使用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;
}
}
}