在用户正在DataGridView中编辑的单元格的列标题中添加刻度标记

时间:2012-10-09 22:10:06

标签: c# winforms datagridview

在我的DataGridView中,有一个小刻度标记,可帮助用户查看它们所在的行,但它们所在的当前列似乎没有相同类型的刻度线。

enter image description here

1 个答案:

答案 0 :(得分:0)

如果你想要一个实际的标记,你需要做一些自定义绘图,或者操纵排序标记。我不推荐后者,因为现在是一个惯例,列标题中的小箭头意味着“排序”。

但是,您可以使用标题单元格的格式。在此(半粗略但有效)示例中,将标题单元格中的文本更改为粗体以指示当前所选单元格所在的列。当用户通过Tab键更改单元格或只是单击新单元格时,正确的列标题文本将更改为粗体。

enter image description here

显然,还有一些其他属性要搞乱,尽管你可能不得不试图找一些方法来找到使用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;
        }

    }
}