Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何取消ColumnChanging事件并使绑定控件显示原始值而不是拒绝的更改?_C#_Data Binding_Event Handling - Fatal编程技术网

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

C# 如何取消ColumnChanging事件并使绑定控件显示原始值而不是拒绝的更改?,c#,data-binding,event-handling,C#,Data Binding,Event Handling,我有一个相当复杂的表单,有几个可互换的子面板类,每个类都有自己的几个用户控件。其中一个子面板有一个复选框,根据在其他子面板中选择的选项,可能不允许取消选中该复选框 理想情况下,我会通过在不允许取消选中复选框时使复选框只读来处理此问题,但这需要检测可能启用/禁用复选框的任何更改,计算是否应启用复选框,然后告诉子面板启用/禁用复选框。似乎更容易检测到取消选中复选框的尝试,计算当前状态是否允许取消选中复选框,然后接受或拒绝尝试 我们使用的约定是将事件处理程序附加到页面数据表的ColumnChanged

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

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

我们使用的约定是将事件处理程序附加到页面数据表的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,“错误消息”)
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();
   }
}
如果有人有一个解决方案只会弄乱相关的数据表,我很乐意接受