c# - 单击 dataGrid 中的复选框时出错
问题描述
我正在使用一个 dataGrid,它的一列中有一个复选框。我想检测何时单击和取消单击此复选框并执行某些操作,所以我这样做了:
private void dataGridView2_CellContentClick(object sender, DataGridViewCellEventArgs e)
{
Trace.WriteLine("Cell Content Click Col: " + e.ColumnIndex + " Row: " + e.RowIndex);
if(e.ColumnIndex==0) //it is a check
{
Trace.WriteLine("Value:"+ dataGridView2.Rows[e.RowIndex].Cells[e.ColumnIndex].Value);
}
dataGridView2.CommitEdit(DataGridViewDataErrorContexts.Commit); //This has to be put here in order for CellValueChanged to work
//see https://stackoverflow.com/a/11844206/4451521
}
private void dataGridView2_CellValueChanged(object sender, DataGridViewCellEventArgs e)
{
Trace.WriteLine("Cell value changed " + e.ColumnIndex + " Row: " + e.RowIndex);
Trace.WriteLine("Value:" + dataGridView2.Rows[e.RowIndex].Cells[e.ColumnIndex].Value);
if(e.ColumnIndex==0&& (bool)dataGridView2.Rows[e.RowIndex].Cells[e.ColumnIndex].Value==true)
{
dataGridView2.Rows[e.RowIndex].Cells["Quantity"].Value = 1.0;
}
else if (e.ColumnIndex == 0 && (bool)dataGridView2.Rows[e.RowIndex].Cells[e.ColumnIndex].Value == false)
{
dataGridView2.Rows[e.RowIndex].Cells["Quantity"].Value = 0;
}
Trace.WriteLine("----------------------------");
Merge();//an algorithm to merge rows when necessary
}
现在,这在 99% 的情况下都非常有效。每次我单击复选框(第 0 列)时,我都会得到
Cell Content Click Col: 0 Row: 4
Value:False
Cell value changed 0 Row: 4
Value:True
Cell value changed 4 Row: 4
Value:1
因此将其从 False 更改为 True 并将第 4 列设置为 1。
每次我取消选中它我都会得到
Cell Content Click Col: 0 Row: 4
Value:True
Cell value changed 0 Row: 4
Value:False
Cell value changed 4 Row: 4
Value:0
这次将其从 True 更改为 False 并将第 4 列设置为 0
但是,如果我开始玩检查并多次取消检查,有时即使我检查它(或取消检查它在两种情况下都会发生),该功能CellContentClick
也不会注册。
这意味着即使我“单击了内容”(通过选中或取消选中它),也不会调用该函数。导致检查列但第 4 列中的值不是 1 的不良行为(反之亦然)
这偶尔会发生,但我想知道为什么会发生这种情况以及如何纠正它。
编辑:
尝试了“重复”问题中建议的答案,它实际上不起作用。此外,它使情况变得更糟。在最初的问题中,有时(1% 的情况)单击不起作用,但是一旦再次单击它,一切都会正常运行。在另一个问题中,答案(尝试 CellClick)不会改变另一列。更糟糕的是,一旦它不起作用,它就会一直不起作用。例如我检查它并且值没有改变。然后我取消选中它,现在值变为 1(不是 0!)。当我再次检查时,t 变为 0(不是 1!)。解决方案不起作用
解决方案
所以这就是你需要做的:
- 将所有临时数据(复选框的选中 ID)以 XML 格式放置,仅存储 ID。
- 创建允许您过滤 XML 的方法。
- 检查和取消选中该复选框将很容易。
推荐阅读
- json - 如何在没有中间字符串的情况下将 node.js 缓冲区转换为 JavaScript 对象
- python - 使用 lxml 进行 Python 网页抓取 - 如何登录
- c++ - 在 MacOSX 登录时启动我的程序
- javascript - 如何在 RabbitMq node-amqplib 库中检查连接是否存在?
- c# - WPF:TextBlock AutomationProperties.HelpText 更改
- node.js - 部署到heroku,出现错误
- sql-server - 动态转置列和行
- qt - TreeView:模型的参考错误
- c++ - 比较大型数据集中的向量
- python - 如何解决:'str' 对象在 keras 中没有属性 'data_format'