在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/