如何取消 ColumnChanging 事件并让绑定控件显示原始值而不是拒绝的更改

本文关键字:原始 显示 拒绝 控件 绑定 取消 何取消 ColumnChanging 事件 | 更新日期: 2023-09-27 18:32:38

我有一个相当复杂的表单,其中包含几个可互换的子面板类,每个子面板类都有自己的几个用户控件。其中一个子面板有一个复选框,根据在其他子面板中选择的选项,可能不允许取消选中该复选框。

理想情况下,我会通过在不允许取消选中复选框时将复选框设为只读来处理这个问题,但这需要检测任何可能启用/禁用复选框的更改,计算是否应该启用它,然后告诉子面板启用/禁用复选框。似乎更容易检测取消选中复选框的尝试,计算当前状态是否允许取消选中它,然后接受或拒绝该尝试。

我们使用的约定是将事件处理程序附加到页面数据表的 ColumnChanged 或 ColumnChanging 事件,然后让该处理程序根据更改的列调用适当的帮助程序方法。我输入了下面的代码:

private void MyTable_ColumnChanging(object sender, DataColumnChangeEventArgs e) {
   ...
   if (e.Column == MyTrueFalseColumn) {
      CheckboxChanging(e);
   }
   ...
}
private void CheckboxChanging(DataColumnChangeEventArgs e) {
   if (!(bool)e.ProposedValue && MustRemainChecked())
     e.ProposedValue = true;
}

我还尝试了e.Row.SetColumnError(e.Column, "error message")e.Row.CancelEdit()e.Row.RejectChanges()来代替e.ProposedValue = true,并确认这些行已执行,但复选框仍然未选中,没有任何迹象表明幕后发生了任何事情。我也尝试了所有 4 种取消方法,然后是 MyCheckBox.DataBindings[0].ReadValue() ,再次没有成功。

我使用断点来逐步执行并确认建议的值设置为 true,但在事件完成时复选框仍未选中。我做错了什么?

数据列是否正确存储了 true,但复选框不会更新以反映这一点?我还需要执行其他操作才能使数据列存储更改后的提议值吗?

如何取消 ColumnChanging 事件并让绑定控件显示原始值而不是拒绝的更改

我最终通过直接在 ColumnChanged 事件而不是 ColumnChanging 事件中弄乱复选框来解决这个问题:

private void MyTable_ColumnChanged(object sender, DataColumnChangeEventArgs e) {
   if (e.Column == MyTrueFalseColumn)
      CheckboxChanged(e);
}
private void CheckboxChanged(DataColumnChangeEventArgs e) {
   if (!(bool)e.ProposedValue && MustRemainChecked()) {
      MyCheckbox.Checked = true;
      MyCheckbox.DataBindings[0].WriteValue();
   }
}

如果有人有一个只会弄乱相关数据表的解决方案,我很乐意接受。

e.Row.CancelEdit();

这将取消更新当前数据行的建议值。