zoukankan      html  css  js  c++  java
  • .Net 中Textbox控件的数据绑定

       .Net的数据绑定还是挺博大精深的,最常用的就是绑定一个DataTable到一个DataGridView上面,不过这个不是本文的重点,本文主要介绍如何绑定一个实体类的某个字段到TextBox上,这在实际应用中是最常见的。如果代码中改变实体类的一个字段的值,界面上能够相应改变,反之,如果用户改变界面上的值,实体类能够自动改变,这能够极大的减轻编程的工作量。

       TextBox有个DataBindgs属性,用来设置绑定。它的使用很简单,只需要使用textBox.DataBings.Add()方法来为其设置绑定。Add方法有一个重载是接受一个Binding对象,还有一个是接受三个参数,分别是要绑定到TextBox的哪个属性上,哪个对象是数据源,绑定数据源的哪个字段。例如有下列实体类:

    class Entity 
    {
        private string field;
        public string Field
        {
            get { return field; }
            set
            {
                field = value;
            }
        }
    }
     
    我们要绑定其中的Field字段的值到textbox1的Text属性上,只需要如下代码:
    textBox1.DataBindings.Add("Text", obj, "Field");    
    完整的测试代码如下:

    首先新建一个WindowsApplicaton项目,在一个空白的Form上面放上一个TextBox和两个Button,其中一个button用来显示实体类的值,另一个button用来在代码中改变实体类的值。代码如下:

    public partial class Form1 : Form
       {
           public Form1()
           {
               InitializeComponent();
           }
           Entity obj = new Entity();
           private void Form1_Load(object sender, EventArgs e)
           {          
               textBox1.DataBindings.Add("Text", obj, "Field");      
    
           }
    
           private void button1_Click(object sender, EventArgs e)
           {
               MessageBox.Show(obj.Field);
           }
    
           private void button2_Click(object sender, EventArgs e)
           {
               obj.Field = "wow";
               
           }
       }

    test

    运行程序可以发现,如果用户改变文本框中的值,点击button1可以看到实体类的值已经改变,然而点击button2之后文本框的值却没有改变。这仅仅实现了单向的绑定。

         经过尝试,发现如果要实现双向绑定,对数据源有一定的要求,例如,如果数据源实现了INotifyPropertyChanged 接口就可以。这个接口位于System.CompomentModel命名空间中,这个接口很简单,只有一个事件。不过它提供了一种机制可以通知被绑定的对象,数据源已经发生了改变。下面的代码是实现了这个接口的实体类:

    class Entity:INotifyPropertyChanged
    {
        private string field;
        public string Field
        {
            get { return field; }
            set
            {
                field = value;
                SendChangeInfo("Field");
            }
        }
    
        private void SendChangeInfo(string propertyName)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
            }
        }
        #region INotifyPropertyChanged Members
    
        public event PropertyChangedEventHandler PropertyChanged;
    
        #endregion
    }

    把实体类改成这样之后,再运行一下程序,就可以发现点击button2的时候textbox的内容立刻发生了改变。

        我查了下msdn,我没有找到在何处msdn明确说明实现了INotifyPropertyChanged接口的实体类可实现双向绑定,或许是在深入剖析数据绑定的文章中说的吧。我想到这样做是参考了Linq设计器自动生成的代码。

        下一篇打算研究下绑定的文本框(包括其他类型的控件)如何进行数据验证。还打算写一篇如何绑定DataTable或者IList<T>类型的数据源。

  • 相关阅读:
    pycharm 对mysql的可视化操作
    pycharm连接linux创建django工程
    linux上安装pycharm
    pycharm激活码
    Windows下安装pip
    migrate设置
    python相对目录的基本用法(一)
    pycharm设置连接github
    在shell终端操作oracle数据库的常用命令
    在windows中把一个文件夹打成war包
  • 原文地址:https://www.cnblogs.com/yinzixin/p/1597643.html
Copyright © 2011-2022 走看看