VS2005 Winform 控制绑定操作新特性 DataSourceUpdateMode.OnPropertyChanged
用.Net开发WinForm的MIS项目时也许你有和我有同样的感受:进行据绑操作控制总有一点不如人意.可能你觉得实现数据库管理软件大部分功能用数据绑定(DataBinding)并非唯一途径,但在RAD开发大环境下,他毕竟给程序开发者不少实惠.因此在此着重强调一下VS2005绑定新特性DataSourceUpdateMode.OnPropertyChanged
当我们在开发WinForm程序时经常有这么个需求,当UI上某个绑定控件(比如文本框txtName)的值被用户修改,要求同时触发其他控制(如保存,取消按钮可用.而新增,删除按钮不可用).我们不难想到捕获DataTable.ColumnChanged事件,但实际上此事件并不能给你一个满意的答案.如果你已经另辟蹊径解决了此问题,权当"曲线救国",毕竟条条大路通罗马.呵呵.
我"曲线救国"的方法是捕获DataTable.TextChanged来实现,如此界面控件和数据又紧密耦合了.从程序可扩展性方面考虑,这样恰恰是我们不期望的.
是不是微软的真的没有提供很好的方法呢?非也(实际上VS2003的确没有,VS2005才增加了此特性)!
看代码:
private void Demo_Load(object sender, EventArgs e)
{
//1.创建一个有两个列的Table
DataTable dtDemo = new DataTable("demo");
dtDemo.Columns.Add("code",typeof(string));
dtDemo.Columns.Add("name",typeof(string));
//2.给Table增加两行记录
dtDemo.Rows.Add("GZ", "广州");
dtDemo.Rows.Add("GZ", "北京");
//绑定1
//txtcode.DataBindings.Add("text", dtDemo, "code");
//txtname.DataBindings.Add("text", dtDemo, "name");
//绑定2
txtcode.DataBindings.Add("text", dtDemo, "code", true, DataSourceUpdateMode.OnPropertyChanged);
txtname.DataBindings.Add("text", dtDemo, "name", true, DataSourceUpdateMode.OnPropertyChanged);
//4.捕获DataTable.ColumnChanged
dtDemo.ColumnChanged +=new DataColumnChangeEventHandler(dtDemo_ColumnChanged);
}
private void dtDemo_ColumnChanged(object sender, DataColumnChangeEventArgs e)
{
MessageBox.Show("触发了DataTable.ColumnChanged!");
}
运行效果如下:
如果取消代码绑定1的注释并将代码绑定2注释,进行编译运行,你改变"广州"并不能触发DataTable.ColumnChanged事件,只有修改完焦点离开后才能触发,如果你注释代码绑定1代取消代码绑定2注释,在做同样的动作你发现只要你修改"广州",不离开焦点它也会触发DataTable.ColumnChanged.这是因为DataSourceUpdateMode.OnPropertyChanged发挥了作用了,只要TextBox的text属性发生更改都会及时通知DataTable.
这样解释你能理解吗?
第一次写Blog,感觉废话特多,很难入正题,而且写比说难多了.欢迎您赐教并指正!