同时选中DataGridView中的所有复选框

4

目标:在触发事件处理程序时能够检查所有复选框。

当前情况:事件处理程序按照预期触发。我有一个foreach循环,遍历每一行并选中该行的复选框。

问题:如果在“全选”之前选择了某一行,则除了所选/突出显示的行中的复选框外,所有复选框都将被选中。如果此后单击复选框区域以外的其他地方,则该复选框会自动选中。

问题:如何使所有复选框在同一时间内被选中,而不管是否选择了哪一行?

代码:

foreach (DataGridViewRow row in mTargets.Rows)
{
    //row.Cells[(int) menuItem.Tag].Value is the check box
    //mDeselect is the boolean that I want to set
    row.Cells[(int) menuItem.Tag].Value = !mDeselect;
}

尝试过清除选择和暂停/恢复布局。我也尝试过研究是否有其他人遇到了同样的问题,但这是一个难以找到的主题。
非常感谢任何优雅的建议或解决方案的参考!谢谢!
使用优雅的解决方案和说明进行更新:出现这种副作用的原因是DataGridViewCheckBoxCell认为它仍处于编辑模式,每当您选择单元格(或似乎是选择该行)时。为了解决这个问题,以下是我在foreach循环之前放置的代码,帮助我解决了这个问题:
if (mTargets.IsCurrentCellInEditMode)
{
    mTargets.EndEdit();
}
2个回答

3
这种副作用发生的原因是 DataGridViewCheckBoxCell 认为它仍处于编辑模式,每当您选择单元格时(或者看起来是选择该行)。为了解决这个问题,以下是我在 foreach 循环之前放置的代码,帮助我解决了这个问题:
if (mTargets.IsCurrentCellInEditMode)
{
    mTargets.EndEdit();
}

0

我以前也遇到过这个问题。它并不是设置了值但无法正确地显示出来。我解决的方法(远非理想,但可行)是先设置复选框的值,然后将选定的行更改为另一行,再将其更改回来。


这肯定需要较少的工作来修复。我也会尝试这个方法。但是这与我清除选定内容有什么不同呢?对我来说,这似乎是一样的。我很困惑为什么会发生这种情况,因为我相信我们不是唯一经历过这种问题的人。"全选"是一种常见的功能。 - susieloo_
1
DataGridView是一个非常复杂的控件,由于其功能众多,它会做出很多奇怪的事情。这可能是重绘代码中的一个小错误,导致复选框无法正确地重绘。在DataGridView中清除选择并不等同于更改选择,你可能认为它们很相似,但在控件内部的某个深处,它们的工作方式是不同的。 - Jeffrey Wieder
我尝试过这个,但对我没用。:( 它只有一半的时间能够工作,具体取决于我更改选择的位置。 - susieloo_
如果它只有一半的时间工作,那很可能是一个时间问题,尝试在重新选择之前放置一个短的Thread.Sleep。从100毫秒开始小心尝试,并逐渐增加以查看是否可以获得一致的结果。 - Jeffrey Wieder
那没起作用。回到原来的行为。太奇怪了!编辑:实际上,它仍然有一半的时间可以工作。 - susieloo_
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接