C# 如何取消ColumnChanging事件并使绑定控件显示原始值而不是拒绝的更改?
我有一个相当复杂的表单,有几个可互换的子面板类,每个类都有自己的几个用户控件。其中一个子面板有一个复选框,根据在其他子面板中选择的选项,可能不允许取消选中该复选框 理想情况下,我会通过在不允许取消选中复选框时使复选框只读来处理此问题,但这需要检测可能启用/禁用复选框的任何更改,计算是否应启用复选框,然后告诉子面板启用/禁用复选框。似乎更容易检测到取消选中复选框的尝试,计算当前状态是否允许取消选中复选框,然后接受或拒绝尝试 我们使用的约定是将事件处理程序附加到页面数据表的ColumnChanged或ColumnChanging事件,然后让该处理程序根据更改的列调用适当的帮助程序方法。我输入了下面的代码:C# 如何取消ColumnChanging事件并使绑定控件显示原始值而不是拒绝的更改?,c#,data-binding,event-handling,C#,Data Binding,Event Handling,我有一个相当复杂的表单,有几个可互换的子面板类,每个类都有自己的几个用户控件。其中一个子面板有一个复选框,根据在其他子面板中选择的选项,可能不允许取消选中该复选框 理想情况下,我会通过在不允许取消选中复选框时使复选框只读来处理此问题,但这需要检测可能启用/禁用复选框的任何更改,计算是否应启用复选框,然后告诉子面板启用/禁用复选框。似乎更容易检测到取消选中复选框的尝试,计算当前状态是否允许取消选中复选框,然后接受或拒绝尝试 我们使用的约定是将事件处理程序附加到页面数据表的ColumnChanged
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,“错误消息”)
,e.Row.CancelEdit()
,和e.Row.RejectChanges()
来代替e.ProposedValue=true
,并确认了这些行的执行,但复选框仍然取消选中,没有任何指示幕后发生的任何事情。我还尝试了所有4种取消方法,然后是MyCheckBox.DataBindings[0].ReadValue()
,但同样没有成功
我已经使用断点来逐步检查并确认建议的值被设置为true,但是当事件完成时,复选框仍然取消选中。我做错了什么
数据列是否正确存储了true,但复选框不会更新以反映这一点?要让数据列存储更改的ProposedValue,我还需要做些什么吗?我最终通过直接在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();
}
}
如果有人有一个解决方案只会弄乱相关的数据表,我很乐意接受