【问题标题】:Error when clicking a checkbox in a dataGrid单击 dataGrid 中的复选框时出错
【发布时间】:2018-11-16 05:15:08
【问题描述】:

我正在使用一个 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(反之亦然)的不良行为

这种情况偶尔会发生,但我想知道为什么会发生这种情况以及如何纠正它。

编辑:

尝试了“重复”问题中建议的answer,但它实际上不起作用。此外,它使情况变得更糟。在最初的问题中,有时(1% 的情况)点击不起作用,但一旦你再次点击它,一切都会正常运行。 在另一个问题中,答案(尝试 CellClick)不会改变另一列。更糟糕的是,一旦它不起作用,它就会一直不起作用。 例如我检查它并且值没有改变。然后我取消选中它,now 值变为 1(不是 0!)。当我再次检查时,t 变为 0(不是 1!)。解决方法无效

【问题讨论】:

  • 我花了 ...10 秒才找到答案。你花了多长时间把这个问题放在一起......
  • @JohnB 试过了。不,不起作用。它实际上使解决方案变得更糟。从 1% 不工作到根本不工作(现在一旦失败,它将永远失败)
  • @KansaiRobot 我不明白你在说什么。您有一个问题/任务“检测何时单击和取消单击此复选框并执行某些操作”,因此您想出了一些算法。如果你的算法工作的次数少于 100%,那就是不正确的。在您的情况下,它是简单的算法,没有任何概率或任何随机数据,因此它应该 100% 的工作。而且不管是1%、5%还是99%,都是不正确的。
  • @SeM 简单来说,在极少数情况下,(我强调很难产生这种效果)当你选中该框时,它不会将其注册为CellContentClick跨度>

标签: c# checkbox datagridview click


【解决方案1】:

所以这是你需要做的:

  • 将所有临时数据(复选框的选中 ID)以 XML 格式保存,仅存储 ID。
  • 创建允许您过滤 XML 的方法。
  • 选中和取消选中该复选框将很容易。

【讨论】:

  • 是的,这种方法是动态的,为了将来的目的,与你的比较。
猜你喜欢
  • 1970-01-01
  • 2021-10-06
  • 2018-08-07
  • 2021-12-16
  • 1970-01-01
  • 1970-01-01
  • 2011-04-19
  • 2021-07-06
相关资源
最近更新 更多