c# 如何将RadioButton与DataTable数据进行绑定
程序员文章站
2023-11-17 13:01:52
control类有一个公共的属性是databindings,它可以将控件的属性与其他的数据绑定在一起。我接触到的有将两个控件的数据绑定、将控件的属性与datatable绑定...
control类有一个公共的属性是databindings,它可以将控件的属性与其他的数据绑定在一起。我接触到的有将两个控件的数据绑定、将控件的属性与datatable绑定。以下说说在将datatable与radiobutton绑定的过程中出现的问题。
界面上有两个radiobutton,rdoa和rdob,以及一个显示dt数据的button;后台定义一个私有变量datatable dt。界面初始化完成后,将rdo与dt的值绑定起来。
datatable dt = null;
public databinding2()
{
initializecomponent();
dt = new datatable();
dt.columns.add("a", typeof(bool));
dt.columns.add("b", typeof(bool));
dt.rows.add(rdoa.checked, rdob.checked);
rdoa.databindings.add("checked", dt, "a");
rdob.databindings.add("checked", dt, "b");
btndtvalue.click += (a, b) =>
messagebox.show(string.format("a: {0}\r\nb: {1}", dt.rows[0]["a"], dt.rows[0]["b"]));
}
到这里,完成思路需要的代码似乎敲完了,进入调试,看看结果。
没有点击任何radiobutton之前,查看dt的数据是正确的。
点击rdoa之后,再次查看dt的数据。
出现错误了。点击rdoa之后,rdoa的checked状态为true,这点没错,但是rdoa的状态会变成false,为什么绑定的dt里面b的值仍然是true呢??
我们可以仔细的研究control.databindings.add这个方法。
它有好几个扩展的方法,上面的示例中调用的是
public binding add(string propertyname, object datasource, string datamember)
查看它后台实际执行的是什么函数呢?
public binding add(string propertyname, object datasource, string datamember)
{
return this.add(propertyname, datasource, datamember, false, this.defaultdatasourceupdatemode,
null, string.empty, null);
}
继续追查this.defaultdatasourceupdatemode的选项。在微软的官方说明文字中可以看到这样一段
"在未指定 datasourceupdatemode 的 binding 添加到集合中的情况下,将使用 defaultdatasourceupdatemode 属性。对于 windows 窗体控件,此默认值是 onvalidation"。
接下来的问题是,点击rdoa之后,是否会执行rdob控件的onvalidation函数呢?于是在另一个项目里做了测试,(详细的测试方法可以看这里)两个radiobutton,初始时,rdoa为true,rdob为false。点击rdob,会发现执行的事件包括:
1, rdoa, 事件:checkedchanged
2, rdob, 事件:checkedchanged
3, rdob, 事件:validating
4, rdob, 事件:validated
由上面的结果可以看出,rdoa的验证事件并不会触发。也就是说rdoa此刻的checked值并不会绑定到dt里面。
问题出在这里。找到问题之后修改起来就非常简单了。add调用另一个重载的方法,输入datasourceupdatemode。
rdoa.databindings.add("checked", dt, "a", false, datasourceupdatemode.onpropertychanged);
rdob.databindings.add("checked", dt, "b", false, datasourceupdatemode.onpropertychanged);
界面上有两个radiobutton,rdoa和rdob,以及一个显示dt数据的button;后台定义一个私有变量datatable dt。界面初始化完成后,将rdo与dt的值绑定起来。
复制代码 代码如下:
datatable dt = null;
public databinding2()
{
initializecomponent();
dt = new datatable();
dt.columns.add("a", typeof(bool));
dt.columns.add("b", typeof(bool));
dt.rows.add(rdoa.checked, rdob.checked);
rdoa.databindings.add("checked", dt, "a");
rdob.databindings.add("checked", dt, "b");
btndtvalue.click += (a, b) =>
messagebox.show(string.format("a: {0}\r\nb: {1}", dt.rows[0]["a"], dt.rows[0]["b"]));
}
到这里,完成思路需要的代码似乎敲完了,进入调试,看看结果。
没有点击任何radiobutton之前,查看dt的数据是正确的。
点击rdoa之后,再次查看dt的数据。
出现错误了。点击rdoa之后,rdoa的checked状态为true,这点没错,但是rdoa的状态会变成false,为什么绑定的dt里面b的值仍然是true呢??
我们可以仔细的研究control.databindings.add这个方法。
它有好几个扩展的方法,上面的示例中调用的是
复制代码 代码如下:
public binding add(string propertyname, object datasource, string datamember)
查看它后台实际执行的是什么函数呢?
复制代码 代码如下:
public binding add(string propertyname, object datasource, string datamember)
{
return this.add(propertyname, datasource, datamember, false, this.defaultdatasourceupdatemode,
null, string.empty, null);
}
继续追查this.defaultdatasourceupdatemode的选项。在微软的官方说明文字中可以看到这样一段
"在未指定 datasourceupdatemode 的 binding 添加到集合中的情况下,将使用 defaultdatasourceupdatemode 属性。对于 windows 窗体控件,此默认值是 onvalidation"。
接下来的问题是,点击rdoa之后,是否会执行rdob控件的onvalidation函数呢?于是在另一个项目里做了测试,(详细的测试方法可以看这里)两个radiobutton,初始时,rdoa为true,rdob为false。点击rdob,会发现执行的事件包括:
1, rdoa, 事件:checkedchanged
2, rdob, 事件:checkedchanged
3, rdob, 事件:validating
4, rdob, 事件:validated
由上面的结果可以看出,rdoa的验证事件并不会触发。也就是说rdoa此刻的checked值并不会绑定到dt里面。
问题出在这里。找到问题之后修改起来就非常简单了。add调用另一个重载的方法,输入datasourceupdatemode。
rdoa.databindings.add("checked", dt, "a", false, datasourceupdatemode.onpropertychanged);
rdob.databindings.add("checked", dt, "b", false, datasourceupdatemode.onpropertychanged);
上一篇: c#给图片添加文字的代码小结
下一篇: SQL语句删除和添加外键、主键的方法