我已绑定一个数据表到DataGridView
,此数据表中有一个名为“状态”列是类型的Boolean
。 我可以将值设置为true
或false
通过代码就好了。
然而,我无法弄清楚如何检查是否给定行已签与否。 这是我想使用和编译它显示错误“指定的强制转换无效”的代码。
任何帮助,将不胜感激。
if (rowIndex >= 0)
{
var cbxCell = (DataGridViewCheckBoxCell)dgvScan.Rows[rowIndex].Cells["Status"];
if ((bool)cbxCell.Value)
{
// Do stuff
}
else
{
// Do other 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财产。
另一个注意:如果你把在TrueValue东西如上然后学尝试删除它,真值变为零(哎哟),requireing您删除列,然后才能将其恢复到初始状态重新添加。 或者你可以在代码如下更改:
((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
}
}
}
保持良好的工作
if (Convert.ToBoolean(dgvScan.Rows[rowIndex].Cells["Status"].Value))
{
//Do Something
}
else {
// Do Something
}
可能遇到的另一个问题是这样的:
当用户点击的细胞选择或取消选择的方块中,基础值将不被改变,直到细胞失去焦点。
这会不会是一个问题,如果有问题的代码是一个按钮,因为细胞就会失去焦点,当您单击按钮。 但是,如果你的代码是从计时器所触发,您仍可以检查“老”的价值。
看到我其他的答案: https://stackoverflow.com/a/22080846/1015072
我在这没有现成的经验,但我猜你应该检查的列或属性的值。
试着看看这个例子:
http://programmingwithstyle.blogspot.com/2007/06/how-to-get-from-datagridviewcheckboxcel.html
CbxCell.Value
必须等于DBNull.Value
(您的列可以包含空值吧?)
我会检查的DBNull铸造之前:
if (!DBNull.Value.Equals(CbxCell.Value) && (bool)CbxCell.Value == true)
{
//Do stuff
}
else
{
//Do Stuff
}
bool checked = cell.Value as bool? ?? false;