在C#操做数据库过程当中,针对通常的文本控件,好比TextBox,Label等,咱们赋值直接使用相似TextBox.Text=****的方式 来进行,这种方式从某种意义上来讲的确是最简便的方式,可是对于复杂一些的空间,好比说DataGridView,这个时候,绑定数据源咱们通常使用 DataGridView1.DataSource=****的方式来进行,若是数据源稍微有更改,那么只须要从新调用绑定一遍便可。能够说这种方式是单 向的,也即从数据库到UI,可是有没有一种方式可以实现数据源改变的时候,不用从新绑定DataGridView就让它可以自动刷新数据呢,固然,这里要 提到的就是DataBinding了。数据库
下面来一步一步的进行。测试
首先来看看示例一,主要是利用TextBox的DataBindings方式来进行数据绑定:this
在界面上放置一个TextBox,名称为textBox1,再放置一个TrackBar,名称为trackBar1,而后编写绑定代码以下:spa
textBox1.DataBindings.Add("Text", trackBar1, "Value", false, DataSourceUpdateMode.OnPropertyChanged);
这样,咱们就能够很是明显的看到,当textBox1文本框里面的值改变的时候,trackBar1的值跟着改变;当trackBar1的值改变的时候,文本框中的值也跟着改变,看来,这种改变是双向的。code
在这里我要啰嗦下DataBindings的用法,虽然网上和MSDN上对其的介绍已是多如牛毛:orm
/************************************************
* 第一个值:要绑定到TextBox的什么地方
* 第二个值:数据源是什么
* 第三个值:应该取数据源的什么属性
* 第四个值:是否开启数据格式化
* 第五个值:在何时启用数据源绑定
* *********************************************/
textBox1.DataBindings.Add("Text", trackBar1, "Value", false, DataSourceUpdateMode.OnPropertyChanged);
上面只是一种最简便的方式,可是咱们能不能绑定本身定义的类,把自定义类当作数据源呢?固然能。DataBindings可以接受任意类型的Object类型的数据源。blog
定义类以下:文档
public class MyDataSource
{
public string Myvalue { get; set; }
}
而后咱们在代码中能够按照以下方式绑定:get
MyDataSource mydatasource = new MyDataSource(); //应用于第二种方式
private void mainFrm_Load(object sender, EventArgs e)
{
/*********************************************
* 这个主要就是经过一个外部的类,当作数据源
* *********************************************/
mydatasource.Myvalue = "这是个测试";
textBox2.DataBindings.Add("Text",mydatasource,"Myvalue",false,DataSourceUpdateMode.OnPropertyChanged);
那么,当咱们在界面上看的时候,就会发现,textBox2中显示的是“这是个测试”五个字。string
可是,有时候定义类太麻烦,能不能经过给定的属性来充当数据源呢?这个固然也能,这样的方式,只适合在一些应用很简单的场合,能够按照以下方式绑定:
public int Num { get; set; } //应用于第三种方式
private void mainFrm_Load(object sender, EventArgs e)
{
/*****************************************
*这个主要就是经过自己拥有的属性,当作数据源
****************************************/
Num = 5;
textBox3.DataBindings.Add("Text",this,"Num", false,DataSourceUpdateMode.OnPropertyChanged);
}
这样,咱们就能够把一个类内部的属性当作数据源来使用了。须要注意的是,之因此利用this来充当数据源,是由于窗体他自己就是一个类,Num充当了这个类中的属性而已。
接下来,咱们就须要说到重头戏了,DataGridView的表现形式。
对于这个数据控件,我相信你们都不会陌生,可是如何实现自定义的数据绑定呢?请看代码:
这里咱们首先应该定义一个Model类,以便保存数据:
public class BlogNew
{
public int BlogID { get; set; }
public string BlogTitle { get; set; }
}
而后咱们利用List<T>泛型来保存数据,最后是将这个数据源绑定到dataGridView1控件上:
public List<BlogNew> blogNews { get; set; } //应用于第四种方式
private void mainFrm_Load(object sender, EventArgs e)
{
blogNews = new List<BlogNew>();
blogNews.Add(new BlogNew { BlogID = 1, BlogTitle = "人生若只如初见" });
blogNews.Add(new BlogNew { BlogID = 2, BlogTitle = "何事秋风悲画扇" });
blogNews.Add(new BlogNew { BlogID=3,BlogTitle="最喜欢纳兰性德"});
dataGridView1.DataBindings.Add("DataSource", this, "blogNews", false, DataSourceUpdateMode.OnPropertyChanged);
}
这样绑定完毕之后,在界面上,咱们能够很是自豪的看到本身新加的三条数据。固然,这个没有什么奇怪的。须要注意的是,在这里,咱们设置了 DataSourceUpdateMode.OnPropertyChanged,也就是说,当数据源的改变的时候,数据将从新加载,那么为了测试数据能 不可以自动从新加载(不须要从新绑定数据源),咱们来作个测试,界面上加一个按钮,用来添加一条新的记录:
private void button3_Click(object sender, EventArgs e)
{
//在这里向DataGridView中插入一行
var data = dataGridView1.DataSource as List<BlogNew>;
data.Add(new BlogNew { BlogID = 4, BlogTitle = "取次花丛懒回顾,半缘修道半缘君" });
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>泛型类:
public BindingList<BlogNew> blogNewsRegardUI {get;set; } //应用于DataGridView界面UI更新
private void mainFrm_Load(object sender, EventArgs e)
{
blogNewsRegardUI = new BindingList<BlogNew>();
blogNewsRegardUI.Add(new BlogNew { BlogID = 11, BlogTitle = "僵卧孤村不自哀" });
blogNewsRegardUI.Add(new BlogNew { BlogID = 12, BlogTitle = "尚思为国戍轮台" });
blogNewsRegardUI.Add(new BlogNew { BlogID = 13, BlogTitle = "夜阑卧听风吹雨" });
dataGridView2.DataBindings.Add("DataSource", this, "blogNewsRegardUI", false, DataSourceUpdateMode.OnPropertyChanged);
}
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 = 20, BlogTitle = "竹外桃花三两枝,春江水暖鸭先知" });
}
而后当咱们再点击添加按钮的时候,咱们发现,虽然咱们没有从新绑定数据源(只是数据源有所改变),就致使界面正确的添加进去数据了。
呵呵,但愿有用,谢谢,下面附上截图和所有代码:
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;
namespace WindowsFormsApplication1
{
public partial class mainFrm : Form
{
public mainFrm()
{
InitializeComponent();
}
MyDataSource mydatasource = new MyDataSource(); //应用于第二种方式
public int Num { get; set; } //应用于第三种方式
public List<BlogNew> blogNews { get; set; } //应用于第四种方式
public BindingList<BlogNew> blogNewsRegardUI {get;set; } //应用于DataGridView界面UI更新
private void mainFrm_Load(object sender, EventArgs e)
{
#region 测试一
/************************************************
* 第一个值:要绑定到TextBox的什么地方
* 第二个值:数据源是什么
* 第三个值:应该取数据源的什么属性
* 第四个值:是否开启数据格式化
* 第五个值:在何时启用数据源绑定
* *********************************************/
textBox1.DataBindings.Add("Text", trackBar1, "Value", false, DataSourceUpdateMode.OnPropertyChanged);
#endregion
#region 测试二
/*********************************************
* 这个主要就是经过一个外部的类,当作数据源
* *********************************************/
mydatasource.Myvalue = "这是个测试";
textBox2.DataBindings.Add("Text",mydatasource,"Myvalue",false,DataSourceUpdateMode.OnPropertyChanged);
#endregion
#region 测试三
/*****************************************
*这个主要就是经过自己拥有的属性,当作数据源
****************************************/
Num = 5;
textBox3.DataBindings.Add("Text",this,"Num", false,DataSourceUpdateMode.OnPropertyChanged);
#endregion
#region 测试四 : List<T>
blogNews = new List<BlogNew>();
blogNews.Add(new BlogNew { BlogID = 1, BlogTitle = "人生若只如初见" });
blogNews.Add(new BlogNew { BlogID = 2, BlogTitle = "何事秋风悲画扇" });
blogNews.Add(new BlogNew { BlogID=3,BlogTitle="最喜欢纳兰性德"});
dataGridView1.DataBindings.Add("DataSource", this, "blogNews", false, DataSourceUpdateMode.OnPropertyChanged);
#endregion
#region 测试五 : BindingList<T>
blogNewsRegardUI = new BindingList<BlogNew>();
blogNewsRegardUI.Add(new BlogNew { BlogID = 11, BlogTitle = "僵卧孤村不自哀" });
blogNewsRegardUI.Add(new BlogNew { BlogID = 12, BlogTitle = "尚思为国戍轮台" });
blogNewsRegardUI.Add(new BlogNew { BlogID = 13, BlogTitle = "夜阑卧听风吹雨" });
dataGridView2.DataBindings.Add("DataSource", this, "blogNewsRegardUI", false, DataSourceUpdateMode.OnPropertyChanged);
#endregion
}
private void button1_Click(object sender, EventArgs e)
{
//从这里能够看出,改变了TextBox2中的值,这里的值也改变了,缘由是由于类属于引用类型
MessageBox.Show(mydatasource.Myvalue);
}
private void button2_Click(object sender, EventArgs e)
{
//从这里能够看出,改变了TextBox3中的值,这里的值也改变了,
//缘由是Num被当作了当前窗体的一个属性(窗体自己就是一个类),也属于引用类型
MessageBox.Show(Num.ToString());
}
private void button3_Click(object sender, EventArgs e)
{
//在这里向DataGridView中插入一行
var data = dataGridView1.DataSource as List<BlogNew>;
data.Add(new BlogNew { BlogID = 4, BlogTitle = "取次花丛懒回顾,半缘修道半缘君" });
foreach(BlogNew blogNew in dataGridView1.DataSource as List<BlogNew>)
{
/***********
* 当咱们心插入一条BlogID记录为4的数据的时候,在界面上能够看出dataGridView1的dataSource已经被更新,
* 可是界面上依旧显示为BlogID为1,2,3三条数据,很奇怪
* *********************/
MessageBox.Show(blogNew.BlogID + "--" + blogNew.BlogTitle);
}
}
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 = 20, BlogTitle = "竹外桃花三两枝,春江水暖鸭先知" });
}
}
public class MyDataSource
{
public string Myvalue { get; set; }
}
public class BlogNew
{
public int BlogID { get; set; }
public string BlogTitle { get; set; }
}
}
截图以下:
参考文档:http://laiyuhan.blog.163.com/blog/static/1060389320101130101421991/