15

我已将数据表绑定到DataGridView,该数据表有一个名为“状态”的列,其类型为Boolean。我可以通过代码将值设置为truefalse就好了。

但是,我不知道如何检查给定的行是否已经被检查。这是我尝试使用的代码,编译它显示错误“指定的演员表无效”。

任何帮助,将不胜感激。

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

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

7 回答 7

10

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

    if (cbxCell.Value != null && (bool)cbxCell.Value)
    {
        do stuff;
    }

解决此问题的另一种方法是将列的 TrueValue 属性设置为某个值。这可以在设计时完成,如下所示:

在此处输入图像描述

然后你可以写:

    if ((string)cbxCell.Value == "T")
    {
        do stuff;
    }

这是有效的,因为字符串可以为空。

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

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

((DataGridViewCheckBoxColumn)DataGridView1.Columns["Selected"]).TrueValue = true
于 2014-01-07T20:52:56.173 回答
10

谢谢你们。有同样的问题,但我发现在检查值之前编写 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
            }
        }
    }

保持良好的工作

于 2016-10-06T16:33:56.207 回答
1

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

当用户单击单元格以选中或取消选中该框时,基础值将不会更改,直到单元格失去焦点。

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

在这里查看我的其他答案: https ://stackoverflow.com/a/22080846/1015072

于 2014-02-27T21:41:30.627 回答
1
 if (Convert.ToBoolean(dgvScan.Rows[rowIndex].Cells["Status"].Value))
{
//Do Something
}
else {
// Do Something
}
于 2013-11-30T06:12:33.920 回答
0

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

试着看看这个例子:

http://programmingwithstyle.blogspot.com/2007/06/how-to-get-from-datagridviewcheckboxcel.html

于 2009-10-13T22:23:51.783 回答
0

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

我会在转换之前检查 DBNull:

if (!DBNull.Value.Equals(CbxCell.Value) && (bool)CbxCell.Value == true)
{
    //Do stuff
}
else
{
    //Do Stuff
}
于 2009-10-13T22:50:30.333 回答
0
bool checked = cell.Value as bool? ??  false;
于 2015-05-25T15:54:11.380 回答