c# - WinForms dataBinding 触发 2 次 CheckedChanged 事件,使 checkBox 不可点击
问题描述
下面的代码来自一个简单的测试应用程序,在表单上只包含一个复选框。
DataTable dt;
public Form1()
{
InitializeComponent();
dt = new DataTable();
dt.Columns.Add("bool", typeof(bool));
dt.Columns.Add("s", typeof(string));
dt.Rows.Add(new object[2] { false, "" });
checkBox1.DataBindings.Add("Checked", dt, "bool", false, DataSourceUpdateMode.OnValidation);
checkBox1.CheckedChanged += CheckBox_CheckedChanged;
}
private void CheckBox_CheckedChanged(object sender, EventArgs e)
{
dt.Rows[0]["s"] = "test";
}
此dt.Rows[0]["s"] = "test";
行使复选框不可点击。CheckedChanged 被触发 2 次。响应点击事件后的第一次。第二次被堆栈中显示 CurrencyManager 和 BindingManagerBase.PushData 的外部代码调用。
如果我删除此行或在计时器中运行它,则复选框的行为是正常的。
解决方案
将数据源更新模式更改为OnPropertyChanged
.
当数据源更新模式为 onOnValidation
时CheckedChanged
,该值仍然没有写入数据源,因为没有发生验证。所以数据源还是有之前的校验状态。然后,在您更改数据源上的值后,无论您更新哪个列,数据绑定都会尝试将当前记录的最新值推送到控件。这就是为什么检查的值不会改变并且总是显示当前行的 bool 列的值。
您也可以尝试此操作,同时将数据源更新模式保持为OnValidation
:
checkBox1.DataBindings["Checked"].WriteValue();
dt.Rows[0]["s"] = "test";
这基本上与将更新模式设置为OnPropertyChanged
.
推荐阅读
- python - 为什么切换屏幕在 kivy 中不起作用?
- python - 当一个方法分支到另一个方法时如何进行单元测试
- excel - 页脚命令第二次无法正常工作
- angular - 主页使用路由器插座在 Angular 11 中渲染两次
- r - learning_curve_dat() with error: $ operator not defined for this S4 class
- html - 如何删除按钮的默认样式
- python - RabbitMQ 鼠兔。如何修复 StreamLostError
- django - 如何参数化测试的 django 设置?
- python - Django MPTT如何从html模板中删除缩进
- web-component - 将 Lit 与 Javascript 一起使用,无需构建工具