如何validation是否已检查DataGridViewCheckBoxCell
我已将数据表绑定到DataGridView
,此数据表有一个名为“Status”的列,其类型为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,Default TRUE值是布尔值True。 这会导致问题,因为布尔值不可为空。 你可以通过两种方式解决这个问题:
if (cbxCell.Value != null && (bool)cbxCell.Value) { do stuff; }
解决此问题的另一种方法是将列的TrueValue属性设置为某个值。 这可以在设计时完成,如下所示:
然后你可以写:
if ((string)cbxCell.Value == "T") { do stuff; }
这是有效的,因为字符串可以为空。
请注意:即使我将FalseValue设置为F,false值仍然似乎为null,因此我建议忽略FalseValue属性。
另一个注意事项:如果您在上面的TrueValue中放置了一些内容然后尝试擦除它,则True值变为null(ouch),要求您删除该列然后重新添加它以将其恢复为默认条件。 或者您可以在代码中更改它,如下所示:
((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;