在C#操作数据库过程中,针对一般的文本控件,比如TextBox,Label等,我们赋值直接使用类似TextBox.Text=****的方式 来进行,这种方式从某种意义上来说的确是最简便的方式,但是对于复杂一些的空间,比如说DataGridView,这个时候,绑定数据源我们一般使用 DataGridView1.DataSource=****的方式来进行,如果数据源稍微有更改,那么只需要重新调用绑定一遍即可。可以说这种方式是单 向的,也即从数据库到UI,但是有没有一种方式能够实现数据源改变的时候,不用重新绑定DataGridView就让它能够自动刷新数据呢,当然,这里要 提到的就是DataBinding了。

下面来一步一步的进行。

首先来看看示例一,主要是利用TextBox的DataBindings方式来进行数据绑定:

在界面上放置一个TextBox,名称为textBox1,再放置一个TrackBar,名称为trackBar1,然后编写绑定代码如下:

  1. textBox1.DataBindings.Add("Text", trackBar1, "Value", false, DataSourceUpdateMode.OnPropertyChanged);

这样,我们就可以非常明显的看到,当textBox1文本框里面的值改变的时候,trackBar1的值跟着改变;当trackBar1的值改变的时候,文本框中的值也跟着改变,看来,这种改变是双向的。

在这里我要啰嗦下DataBindings的用法,虽然网上和MSDN上对其的介绍已经是多如牛毛:

  1. /************************************************
    * 第一个值:要绑定到TextBox的什么地方
    * 第二个值:数据源是什么
    * 第三个值:应该取数据源的什么属性
    * 第四个值:是否开启数据格式化
    * 第五个值:在什么时候启用数据源绑定
    * *********************************************/
    textBox1.DataBindings.Add("Text", trackBar1, "Value", false, DataSourceUpdateMode.OnPropertyChanged);

上面只是一种最简便的方式,但是我们能不能绑定自己定义的类,把自定义类当做数据源呢?当然能。DataBindings能够接受任意类型的Object类型的数据源。

定义类如下:

  1. public class MyDataSource
    {
    public string Myvalue { get; set; }
    }

然后我们在代码中可以按照如下方式绑定:

  1. MyDataSource mydatasource = new MyDataSource(); //应用于第二种方式
  2.  
  3. private void mainFrm_Load(object sender, EventArgs e)
    {
    /*********************************************
    * 这个主要就是通过一个外部的类,当做数据源
    * *********************************************/
    mydatasource.Myvalue = "这是个测试";
    textBox2.DataBindings.Add("Text",mydatasource,"Myvalue",false,DataSourceUpdateMode.OnPropertyChanged);

那么,当我们在界面上看的时候,就会发现,textBox2中显示的是“这是个测试”五个字。

但是,有时候定义类太麻烦,能不能通过给定的属性来充当数据源呢?这个当然也能,这样的方式,只适合在一些应用很简单的场合,可以按照如下方式绑定:

  1. public int Num { get; set; } //应用于第三种方式
  2.  
  3. private void mainFrm_Load(object sender, EventArgs e)
    {
    /*****************************************
    *这个主要就是通过本身拥有的属性,当做数据源
    ****************************************/
    Num = ;
    textBox3.DataBindings.Add("Text",this,"Num", false,DataSourceUpdateMode.OnPropertyChanged);
    }

这样,我们就可以把一个类内部的属性当做数据源来使用了。需要注意的是,之所以利用this来充当数据源,是因为窗体他本身就是一个类,Num充当了这个类中的属性而已。

接下来,我们就需要说到重头戏了,DataGridView的表现形式。

对于这个数据控件,我相信大家都不会陌生,但是如何实现自定义的数据绑定呢?请看代码:

这里我们首先应该定义一个Model类,以便保存数据:

  1. public class BlogNew
    {
    public int BlogID { get; set; }
    public string BlogTitle { get; set; }
    }

然后我们利用List<T>泛型来保存数据,最后是将这个数据源绑定到dataGridView1控件上:

  1. public List<BlogNew> blogNews { get; set; } //应用于第四种方式
  2.  
  3. private void mainFrm_Load(object sender, EventArgs e)
    {
    blogNews = new List<BlogNew>();
    blogNews.Add(new BlogNew { BlogID = , BlogTitle = "人生若只如初见" });
    blogNews.Add(new BlogNew { BlogID = , BlogTitle = "何事秋风悲画扇" });
    blogNews.Add(new BlogNew { BlogID=,BlogTitle="最喜欢纳兰性德"});
  4.  
  5. dataGridView1.DataBindings.Add("DataSource", this, "blogNews", false, DataSourceUpdateMode.OnPropertyChanged);
  1. }

这样绑定完毕以后,在界面上,我们可以非常自豪的看到自己新加的三条数据。当然,这个没有什么奇怪的。需要注意的是,在这里,我们设置了 DataSourceUpdateMode.OnPropertyChanged,也就是说,当数据源的改变的时候,数据将重新加载,那么为了测试数据能 不能够自动重新加载(不需要重新绑定数据源),我们来做个测试,界面上加一个按钮,用来添加一条新的记录:

  1. private void button3_Click(object sender, EventArgs e)
    {
    //在这里向DataGridView中插入一行
    var data = dataGridView1.DataSource as List<BlogNew>;
    data.Add(new BlogNew { BlogID = , BlogTitle = "取次花丛懒回顾,半缘修道半缘君" });
  2.  
  3. foreach(BlogNew blogNew in dataGridView1.DataSource as List<BlogNew>)
    {
    /***********
    * 当我们心插入一条BlogID记录为4的数据的时候,在界面上可以看出dataGridView1的dataSource已经被更新,
    * 但是界面上依旧显示为BlogID为1,2,3三条数据,很奇怪
    * *********************/
    MessageBox.Show(blogNew.BlogID + "--" + blogNew.BlogTitle);
    }
    }

好了,这里我添加了一条新的数据,并且没有进行数据重新绑定,点击按钮,但是悲剧发生了,界面上没有任何新的记录出现,怎么回事?但是通过 foreach循环,我们发现第四条记录明明被添加到数据源中了呀?怎么回事呢?其实我这里也没有搞明白到底为什么,还请大家指教,要解决这个问题,我们 应该利用BindingList<T>泛型类来替换掉List<T>泛型类:

  1. public BindingList<BlogNew> blogNewsRegardUI {get;set; } //应用于DataGridView界面UI更新
  2.  
  3. private void mainFrm_Load(object sender, EventArgs e)
    {
    blogNewsRegardUI = new BindingList<BlogNew>();
    blogNewsRegardUI.Add(new BlogNew { BlogID = , BlogTitle = "僵卧孤村不自哀" });
    blogNewsRegardUI.Add(new BlogNew { BlogID = , BlogTitle = "尚思为国戍轮台" });
    blogNewsRegardUI.Add(new BlogNew { BlogID = , BlogTitle = "夜阑卧听风吹雨" });
  4.  
  5. dataGridView2.DataBindings.Add("DataSource", this, "blogNewsRegardUI", false, DataSourceUpdateMode.OnPropertyChanged);
  6.  
  7. }
  8.  
  9. private void button4_Click(object sender, EventArgs e)
    {
    /*这里主要用来解决DataGridView1界面不更新的问题,其实原因在于使用了List<BlogNew>,这里我们采用BindList<BlogNew>
    *通过测试,我们发现,只要数据源改变,界面就可以自动的进行更新了,很是方便,不需要重新绑定
    */
    var dataRegardUI = dataGridView2.DataSource as BindingList<BlogNew>;
    dataRegardUI.Add(new BlogNew { BlogID = , BlogTitle = "竹外桃花三两枝,春江水暖鸭先知" });
    }

然后当我们再点击添加按钮的时候,我们发现,虽然我们没有重新绑定数据源(只是数据源有所改变),就导致界面正确的添加进去数据了。

呵呵,希望有用,谢谢,下面附上截图和全部代码:

  1. using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
  2.  
  3. namespace WindowsFormsApplication1
    {
    public partial class mainFrm : Form
    {
    public mainFrm()
    {
    InitializeComponent();
    }
  4.  
  5. MyDataSource mydatasource = new MyDataSource(); //应用于第二种方式
  6.  
  7. public int Num { get; set; } //应用于第三种方式
  8.  
  9. public List<BlogNew> blogNews { get; set; } //应用于第四种方式
  10.  
  11. public BindingList<BlogNew> blogNewsRegardUI {get;set; } //应用于DataGridView界面UI更新
  12.  
  13. private void mainFrm_Load(object sender, EventArgs e)
    {
    #region 测试一
    /************************************************
    * 第一个值:要绑定到TextBox的什么地方
    * 第二个值:数据源是什么
    * 第三个值:应该取数据源的什么属性
    * 第四个值:是否开启数据格式化
    * 第五个值:在什么时候启用数据源绑定
    * *********************************************/
    textBox1.DataBindings.Add("Text", trackBar1, "Value", false, DataSourceUpdateMode.OnPropertyChanged);
    #endregion
  14.  
  15. #region 测试二
    /*********************************************
    * 这个主要就是通过一个外部的类,当做数据源
    * *********************************************/
  16.  
  17. mydatasource.Myvalue = "这是个测试";
    textBox2.DataBindings.Add("Text",mydatasource,"Myvalue",false,DataSourceUpdateMode.OnPropertyChanged);
    #endregion
  18.  
  19. #region 测试三
    /*****************************************
    *这个主要就是通过本身拥有的属性,当做数据源
    ****************************************/
    Num = ;
    textBox3.DataBindings.Add("Text",this,"Num", false,DataSourceUpdateMode.OnPropertyChanged);
    #endregion
  20.  
  21. #region 测试四 : List<T>
    blogNews = new List<BlogNew>();
    blogNews.Add(new BlogNew { BlogID = , BlogTitle = "人生若只如初见" });
    blogNews.Add(new BlogNew { BlogID = , BlogTitle = "何事秋风悲画扇" });
    blogNews.Add(new BlogNew { BlogID=,BlogTitle="最喜欢纳兰性德"});
  22.  
  23. dataGridView1.DataBindings.Add("DataSource", this, "blogNews", false, DataSourceUpdateMode.OnPropertyChanged);
  24.  
  25. #endregion
  26.  
  27. #region 测试五 : BindingList<T>
    blogNewsRegardUI = new BindingList<BlogNew>();
    blogNewsRegardUI.Add(new BlogNew { BlogID = , BlogTitle = "僵卧孤村不自哀" });
    blogNewsRegardUI.Add(new BlogNew { BlogID = , BlogTitle = "尚思为国戍轮台" });
    blogNewsRegardUI.Add(new BlogNew { BlogID = , BlogTitle = "夜阑卧听风吹雨" });
  28.  
  29. dataGridView2.DataBindings.Add("DataSource", this, "blogNewsRegardUI", false, DataSourceUpdateMode.OnPropertyChanged);
  30.  
  31. #endregion
    }
  32.  
  33. private void button1_Click(object sender, EventArgs e)
    {
    //从这里可以看出,改变了TextBox2中的值,这里的值也改变了,原因是因为类属于引用类型
    MessageBox.Show(mydatasource.Myvalue);
    }
  34.  
  35. private void button2_Click(object sender, EventArgs e)
    {
    //从这里可以看出,改变了TextBox3中的值,这里的值也改变了,
    //原因是Num被当做了当前窗体的一个属性(窗体本身就是一个类),也属于引用类型
    MessageBox.Show(Num.ToString());
    }
  36.  
  37. private void button3_Click(object sender, EventArgs e)
    {
    //在这里向DataGridView中插入一行
    var data = dataGridView1.DataSource as List<BlogNew>;
    data.Add(new BlogNew { BlogID = , BlogTitle = "取次花丛懒回顾,半缘修道半缘君" });
  38.  
  39. foreach(BlogNew blogNew in dataGridView1.DataSource as List<BlogNew>)
    {
    /***********
    * 当我们心插入一条BlogID记录为4的数据的时候,在界面上可以看出dataGridView1的dataSource已经被更新,
    * 但是界面上依旧显示为BlogID为1,2,3三条数据,很奇怪
    * *********************/
    MessageBox.Show(blogNew.BlogID + "--" + blogNew.BlogTitle);
    }
    }
  40.  
  41. private void button4_Click(object sender, EventArgs e)
    {
    /*这里主要用来解决DataGridView1界面不更新的问题,其实原因在于使用了List<BlogNew>,这里我们采用BindList<BlogNew>
    *通过测试,我们发现,只要数据源改变,界面就可以自动的进行更新了,很是方便,不需要重新绑定
    */
    var dataRegardUI = dataGridView2.DataSource as BindingList<BlogNew>;
    dataRegardUI.Add(new BlogNew { BlogID = , BlogTitle = "竹外桃花三两枝,春江水暖鸭先知" });
    }
    }
  42.  
  43. public class MyDataSource
    {
    public string Myvalue { get; set; }
    }
  44.  
  45. public class BlogNew
    {
    public int BlogID { get; set; }
    public string BlogTitle { get; set; }
    }
    }

截图如下:

参考文档:http://laiyuhan.blog.163.com/blog/static/1060389320101130101421991/

Control.DataBinding数据绑定细解的更多相关文章

  1. Control.DataBinding数据绑定简单用法:

    DataBindings的用法: 第一个值:要绑定到TextBox的什么地方 第二个值:数据源是什么 第三个值:应该取数据源的什么属性 第四个值:是否开启数据格式化 第五个值:在什么时候启用数据源绑定 ...

  2. 手把手教你用git和SourceTree上传项目到github细解(转)

    尊重原创:https://blog.csdn.net/qq_32365567/article/details/52859166 一.引言 我想大家现在都很熟悉github了,也能运用github上开源 ...

  3. 【软件笔记】 ◆笔记·I◆ 各类冷门函数细解

    [软件笔记·I] 各类冷门函数细解 ■题外话■ 总觉得作为一个志向远大的 coder (٩(◕‿◕。)۶),我觉得单单只会做题是不够的所以我开始尝试自己编写软件!初入道的我并不知道C++其实并不太适合 ...

  4. 细解JavaScript ES7 ES8 ES9 新特性

    题记:本文提供了一个在线PPT版本,方便您浏览 细解JAVASCRIPT ES7 ES8 ES9 新特性 在线PPT ver 本文的大部分内容译自作者Axel Rauschmayer博士的网站,想了解 ...

  5. PHP输出缓冲控制- Output Control 函数应用详解

    说到输出缓冲,首先要说的是一个叫做缓冲器(buffer)的东西.举个简单的例子说明他的作用:我们在编辑一篇文档时,在我们没有保存之前,系统是不会向磁盘写入的,而是写到buffer中,当buffer写满 ...

  6. AngularJS语法基础及数据绑定——详解各种数据绑定指令、属性应用

    AngularJS简单易学,但是功能强大.特别是在构建单页面应用方面效果显著.而 数据绑定 可以说是他被广泛使用的最主要的优点.他舍弃了对DOM的操作方式,一切都由AngularJS来自动更新视图,我 ...

  7. 快速开发基于 HTML5 网络拓扑图应用之 DataBinding 数据绑定篇

    前言 发现大家对于我从 json 文件中直接操作节点属性来控制界面的动态变化感到比较好奇,所以这篇就针对数据绑定以及如何使用这些绑定的数据做一篇说明,我写了一个简单的例子,基于机房工控的服务器上设备的 ...

  8. PHP输出缓冲控制 - Output Control 函 应用详解

    简介 说到输出缓冲,首先要说的是一个叫做缓冲器(buffer)的东西.举个简单的例子说明他的作用:我们在编辑一篇文档时,在我们没有保存之前,系统是不会向磁盘写入的,而是写到buffer中,当buffe ...

  9. [WPF系列]-DataBinding(数据绑定) 自定义Binding

    自定义Binding A base class for custom WPF binding markup extensions BindingDecoratorBase Code: public c ...

随机推荐

  1. unity mipmap 糊

    unity 开miapmap会糊很多 尤其在editor里面 我估计和editor的 tempRT resolution 957x380有关 -----确实是这样 手机上糊的程度低很多 中间rt我用的 ...

  2. 深度增强学习--DDPG

    DDPG DDPG介绍2 ddpg输出的不是行为的概率, 而是具体的行为, 用于连续动作 (continuous action) 的预测 公式推导 推导 代码实现的gym的pendulum游戏,这个游 ...

  3. linux(虚拟机中)与windows共享文件两种方法

      Windows 下用 SourceInsight 与 Linux 协作编码     习惯了用SourceInsight 读写代码,在Linux下一时没找到类似的工具,vi的操作也不熟,偶尔看看或小 ...

  4. 查询mysql数据库中所有表名

    查找所有表的语句 select table_name from information_schema.tables where table_schema='当前数据库';  

  5. BST数据结构题

    给定BST.改动BST,使得每一个点都是大于他的结点的值之和 关键是这题递归參数怎么设计,每一个点比他大的有两快.一个是右子书(假设有的话),还有一个是祖先里面比他大的,假设直接用这两个的话,找不到递 ...

  6. Centos 7 搭建蓝鲸3.1.5社区版

    第一次搭建蓝鲸平台,参考了蓝鲸社区的官方搭建文档. 友情链接:蓝鲸智云社区版V3.1用户手册 搭建时遇到了不少的坑,这里做一个详细的安装梳理 主机硬件要求 官方的推荐如下: 我在公司测试环境搭建时机器 ...

  7. 如何使用angularjs实现文本框设置值

    <!DOCTYPE html> <html ng-app="myApp"> <head> <title>angularjs-setV ...

  8. 大并发server架构 &amp;&amp; 大型站点架构演变

    server的三条要求: 高性能:对于大量请求,及时高速的响应 高可用:7*24 不间断,出现问题自己主动转移.这叫fail over(故障转移) 伸缩性:使用跨机器的通信(TCP) 另外不论什么网络 ...

  9. webSQL 实现即时通讯

    websql存储方式一共有以下几个方法 openDatabase:这个方法使用现有的数据库或新建数据库来创建数据库对象. transaction:这个方法允许我们执行事务处理; executeSql: ...

  10. 学 Vim 时希望早点知道的建议

    来自wechat 从 2009 年开始,我就一直把 Vim 当做我的主要(唯一)文本编辑器.在过去的这些年,我学到了很多好用的 Vim 技巧,它们令我感觉相见恨晚,因为它们极大地提高了我的文本编辑效率 ...