现在的位置: 首页 > 综合 > 正文

VS2005 Winform 控制绑定操作新特性 DataSourceUpdateMode.OnPropertyChanged

2012年03月04日 ⁄ 综合 ⁄ 共 1809字 ⁄ 字号 评论关闭

   用.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,感觉废话特多,很难入正题,而且写比说难多了.欢迎您赐教并指正!

抱歉!评论已关闭.