欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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的数据是正确的。
c# 如何将RadioButton与DataTable数据进行绑定 
点击rdoa之后,再次查看dt的数据。
c# 如何将RadioButton与DataTable数据进行绑定 
出现错误了。点击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);