0

在我的 DataGridView 中,有一个小刻度线可以帮助用户可视化他们所在的行,但对于他们所在的当前列似乎没有相同类型的刻度线。

在此处输入图像描述

4

1 回答 1

0

如果您想要一个实际的 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;
        }

    }
}
于 2012-10-10T00:43:43.463 回答