数据网格复选框列选择不正确

本文关键字:选择 不正确 列选 复选框 数据网 网格 数据 | 更新日期: 2023-09-27 18:11:47

我想有一个带有复选框的列,当用户单击它们时,它们选择自己的行(突出显示它)。我已经想出了这个代码,与不做的工作,我怎么能解决它?

有更好的方法吗?(即使在我取消选中复选框后,该行仍保持高亮显示)。

 private void dataGrid_CellClick(object sender, DataGridViewCellEventArgs e)
        {
            if (e.ColumnIndex == 0 && e.RowIndex != -1) 
            {
                if (Convert.ToBoolean(dataGrid.Rows[e.RowIndex].Cells[0].Value) == true)
                    dataGrid.Rows[e.RowIndex].Selected = false;
                else if (Convert.ToBoolean(dataGrid.Rows[e.RowIndex].Cells[0].Value) == false)
                    dataGrid.Rows[e.RowIndex].Selected = true;
            }
        }

数据网格复选框列选择不正确

尝试将逻辑放置在CellMouseUp事件处理程序中,因为CellClick事件发生在CheckBox状态更新之前。

使用EditedFormattedValue属性(包含单元格的当前格式化值)来检索复选框的当前状态。

从MSDN:

Value属性是单元格包含的实际数据对象,而FormattedValue是它的格式化表示形式对象。

存储单元格的当前格式化值,无论是否单元格处于编辑模式,值尚未提交。

下面是一个工作示例。

void dataGrid_CellMouseUp(object sender, DataGridViewCellMouseEventArgs e)
{
    if (e.ColumnIndex == 0 && e.RowIndex != -1)
    {
        DataGridViewCheckBoxCell checkBoxCell =
            dataGrid.Rows[e.RowIndex].Cells[0] as DataGridViewCheckBoxCell;
        if (checkBoxCell != null)
        {
            dataGrid.Rows[e.RowIndex].Selected = Convert.ToBoolean(checkBoxCell.EditedFormattedValue);
        }
    }
}

CellMouseUp将无法使用空格键进行选择。
如果你不需要做"real"选择,我会在单元格值改变时改变行背景颜色,这会更容易:

private void dataGridView1_CellValueChanged(object sender, DataGridViewCellEventArgs e)
{
    if (e.ColumnIndex == 0 && e.RowIndex != -1)
    {
        if (Convert.ToBoolean(dataGridView1.Rows[e.RowIndex].Cells[0].Value) == true)
            dataGridView1.Rows[e.RowIndex].DefaultCellStyle.BackColor = Color.Blue;
        else if (Convert.ToBoolean(dataGridView1.Rows[e.RowIndex].Cells[0].Value) == false)
            dataGridView1.Rows[e.RowIndex].DefaultCellStyle.BackColor = Color.White;
    }
}