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
}
}
}