C# 如何验证是否选中了DataGridViewCheckBoxCell

C# 如何验证是否选中了DataGridViewCheckBoxCell,c#,winforms,datagridview,datagridviewcheckboxcell,C#,Winforms,Datagridview,Datagridviewcheckboxcell,我已将一个数据表绑定到一个DataGridView,该数据表有一个名为“Status”的列,该列的类型为布尔值。我可以通过code将值设置为true或false 但是,我不知道如何检查给定行是否已被检查。这是我试图使用的代码,编译时显示错误“指定的强制转换无效” 任何帮助都将不胜感激 if (rowIndex >= 0) { var cbxCell = (DataGridViewCheckBoxCell)dgvScan.Rows[rowIndex].Cells["Status"];

我已将一个数据表绑定到一个
DataGridView
,该数据表有一个名为“Status”的列,该列的类型为
布尔值
。我可以通过code将值设置为
true
false

但是,我不知道如何检查给定行是否已被检查。这是我试图使用的代码,编译时显示错误“指定的强制转换无效”

任何帮助都将不胜感激

if (rowIndex >= 0)
{
    var cbxCell = (DataGridViewCheckBoxCell)dgvScan.Rows[rowIndex].Cells["Status"];

    if ((bool)cbxCell.Value)
    {
        // Do stuff
    }
    else
    {
        // Do other stuff
    }
}

我以前没有这方面的经验,但我想您应该检查列或属性的值

试着看看这个例子:


CbxCell.Value
必须等于
DBNull.Value
(您的列可以包含null值,对吗?)

我会在施法之前检查DBNull:

if (!DBNull.Value.Equals(CbxCell.Value) && (bool)CbxCell.Value == true)
{
    //Do stuff
}
else
{
    //Do Stuff
}

问题在于DataGridCheckBoxColumn的默认FALSE值为null,而默认TRUE值为布尔值TRUE。这会导致问题,因为布尔值不可为空。您可以通过两种方式解决此问题:

    if (cbxCell.Value != null && (bool)cbxCell.Value)
    {
        do stuff;
    }
解决此问题的另一种方法是将列的TrueValue属性设置为某个值。这可以在设计时完成,如图所示:

然后你可以写:

    if ((string)cbxCell.Value == "T")
    {
        do stuff;
    }
这是因为字符串可以为空

请注意:即使我将FalseValue设置为F,FalseValue似乎仍然为null,因此我建议忽略FalseValue属性

另一个注意事项:如果您如上所述在TrueValue中放入某个内容,然后尝试将其删除,则TrueValue将变为null(哎哟),要求您删除该列,然后重新添加该列,以便将其恢复为默认条件。或者您可以在代码中对其进行如下更改:

((DataGridViewCheckBoxColumn)DataGridView1.Columns["Selected"]).TrueValue = true

可能遇到的另一个问题是:

当用户单击单元格以选中或取消选中复选框时,在单元格失去焦点之前,基础值不会更改

如果有问题的代码在按钮中,这将不是问题,因为单击按钮时单元格将失去焦点。但是,如果您的代码是从计时器触发的,您可能仍然在检查“旧”值

请看我的另一个答案: 谢谢大家。 也有同样的问题,但我发现在检查值之前编写senderGrid.EndEdit()可以解决这个问题

private void dgvRiscos_CellContentClick(object sender, DataGridViewCellEventArgs e)
    {
        var senderGrid = (DataGridView)sender;
        senderGrid.EndEdit();

        if (senderGrid.Columns[e.ColumnIndex] is DataGridViewCheckBoxColumn &&
            e.RowIndex >= 0)
        {

            var cbxCell = (DataGridViewCheckBoxCell)senderGrid.Rows[e.RowIndex].Cells["associado"];
            if ((bool)cbxCell.Value)
            {
                   // Criar registo na base de dados
            }
            else
            {
                   // Remover registo da base de dados
            }
        }
    }

继续做好工作

示例代码中有两个强制转换。哪个是导致错误的原因?将单元格强制转换为DataGridViewCheckBoxCell或将值强制转换为布尔值?可能与此问题不完全相关,但这可能会有所帮助:看起来有点奇怪,但
true.Equals(cbxCell.value)
可以使用
null
DBNull.value
,和默认的布尔值
true
值。如果我可以无限次地向上投票,我会为这个答案这么做,我一直在努力解决这个问题,但你的答案做到了。超级尊敬!
bool checked = cell.Value as bool? ??  false;
private void dgvRiscos_CellContentClick(object sender, DataGridViewCellEventArgs e)
    {
        var senderGrid = (DataGridView)sender;
        senderGrid.EndEdit();

        if (senderGrid.Columns[e.ColumnIndex] is DataGridViewCheckBoxColumn &&
            e.RowIndex >= 0)
        {

            var cbxCell = (DataGridViewCheckBoxCell)senderGrid.Rows[e.RowIndex].Cells["associado"];
            if ((bool)cbxCell.Value)
            {
                   // Criar registo na base de dados
            }
            else
            {
                   // Remover registo da base de dados
            }
        }
    }