0

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

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

我们使用的约定是将事件处理程序附加到页面的数据表的 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 但复选框未更新以反映这一点?为了让数据列存储更改后的 ProposedValue,我还需要做些什么吗?

4

2 回答 2

0

我最终通过直接在 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();
   }
}

如果有人有一个只与相关 DataTable 混淆的解决方案,我很乐意接受。

于 2013-09-24T15:57:50.890 回答
0
e.Row.CancelEdit();

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

于 2021-12-02T23:24:50.617 回答