DataGridView的CurrentRow.Headercell.Selected在c#中总是为false

本文关键字:false CurrentRow Headercell Selected DataGridView | 更新日期: 2023-09-27 18:10:45

Visual Studio 2010。

  1. 创建一个Visual c#"Window Form Application"项目

  2. 在表单中添加一个DataGridView组件并添加一些列

  3. 创建鼠标点击事件:

    private void dataGridView1_CellMouseClick(object sender, DataGridViewCellMouseEventArgs e)
    {
        if (dataGridView1.CurrentRow.HeaderCell.Selected)
        {
            MessageBox.Show("Header Selected");
        }
        if (dataGridView1.CurrentRow.HeaderCell.State != DataGridViewElementStates.None)
        {
            MessageBox.Show("Not None");   
        }                
    }
    
  4. 在运行时通过单击行标头来选择行,但不显示任何MessageBox。

为什么?

DataGridView的CurrentRow.Headercell.Selected在c#中总是为false

要检查是否单击了行标题单元格,以下两个选项都可以:

  • 处理DataGridViewCellClick事件,检查e.ColumnIndex=1是否
  • 处理DataGridViewCellMouseClick事件,检查e.ColumnIndex=1是否
  • 处理DataGridViewRowHeaderMouseClick事件

private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e)
{
    if (e.ColumnIndex == -1)
        MessageBox.Show(e.RowIndex.ToString());
}
private void dataGridView1_RowHeaderMouseClick(object sender, DataGridViewCellMouseEventArgs e)
{
    if (e.ColumnIndex == -1)
        MessageBox.Show(e.RowIndex.ToString());
}
private void dataGridView1_CellMouseClick(object sender, DataGridViewCellMouseEventArgs e)
{
    if (e.ColumnIndex == -1)
        MessageBox.Show(e.RowIndex.ToString());
}

为什么行标题单元格的选定属性为False?

这是这样设计的,并记录在相关msdn文档的备注部分:

DataGridViewHeaderCell。选择属性

此属性对标题单元格没有意义。

这是DataGridViewHeaderCell的选定属性的源代码,它是DataGridViewRowHeaderCell的基类,正如你所看到的,它总是返回false。

[Browsable(false), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
public override bool Selected
{
    get
    {
        return false;
    }
    set
    {
        throw new InvalidOperationException(SR.GetString("DataGridView_HeaderCellReadOnlyProperty", new object[] { "Selected" }));
    }
}

我如何检查行标题单元格的其他属性?

使用HeaderCell属性,如果每一行你可以获得或设置行标题单元格的属性。例如,在上面提到的任何事件中,您可以输入这些代码:

//Set Value property, to see the value you should increase RowHeaderWidths property of DataGridView 
this.dataGridView1.Rows[e.RowIndex].HeaderCell.Value = "Hi";
//Get Selected property that returns false always
MessageBox.Show(this.dataGridView1.Rows[e.RowIndex].HeaderCell.Selected.ToString());

":= "不是赋值操作符= is。

你的代码应该是

DataGridView.SelectionMode = DataGridViewSelectionMode.RowHeaderSelect;

如果你想获得rowheader,这篇文章将会很有帮助。