首页 > 解决方案 > 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 的外部代码调用。

如果我删除此行或在计时器中运行它,则复选框的行为是正常的。

标签: c#winformsdata-binding

解决方案


将数据源更新模式更改为OnPropertyChanged.

当数据源更新模式为 onOnValidationCheckedChanged,该值仍然没有写入数据源,因为没有发生验证。所以数据源还是有之前的校验状态。然后,在您更改数据源上的值后,无论您更新哪个列,数据绑定都会尝试将当前记录的最新值推送到控件。这就是为什么检查的值不会改变并且总是显示当前行的 bool 列的值。

您也可以尝试此操作,同时将数据源更新模式保持为OnValidation

checkBox1.DataBindings["Checked"].WriteValue();
dt.Rows[0]["s"] = "test";

这基本上与将更新模式设置为OnPropertyChanged.


推荐阅读