Control.DataBinding數(shù)據(jù)綁定細解=_第1頁
Control.DataBinding數(shù)據(jù)綁定細解=_第2頁
Control.DataBinding數(shù)據(jù)綁定細解=_第3頁
Control.DataBinding數(shù)據(jù)綁定細解=_第4頁
Control.DataBinding數(shù)據(jù)綁定細解=_第5頁
已閱讀5頁,還剩12頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、Control.DataBinding數(shù)據(jù)綁定細解在C#操作數(shù)據(jù)庫過程中,針對一般的文本控件,比如TextBox,Label等,我們賦值直接使用類似TextBox.Text=*的方式來進行,這種方式從某種意義上來說的確是最簡便的方式,但是對于復雜一些的空間,比如說DataGridView,這個時候,綁定數(shù)據(jù)源我們一般使用DataGridView1.DataSource=*的方式來進行,如果數(shù)據(jù)源稍微有更改,那么只需要重新調用綁定一遍即可??梢哉f這種方式是單向的,也即從數(shù)據(jù)庫到UI,但是有沒有一種方式能夠實現(xiàn)數(shù)據(jù)源改變的時候,不用重新綁定DataGridView就讓它能夠自動刷新數(shù)據(jù)呢,當然,這

2、里要提到的就是DataBinding了。下面來一步一步的進行。首先來看看示例一,主要是利用TextBox的DataBindings方式來進行數(shù)據(jù)綁定:在界面上放置一個TextBox,名稱為textBox1,再放置一個TrackBar,名稱為trackBar1,然后編寫綁定代碼如下:textBox1.DataBindings.Add("Text", trackBar1, "Value", false, DataSourceUpdateMode.OnPropertyChanged);這樣,我們就可以非常明顯的看到,當textBox1文本框里面的值改變的時候,

3、trackBar1的值跟著改變;當trackBar1的值改變的時候,文本框中的值也跟著改變,看來,這種改變是雙向的。在這里我要啰嗦下DataBindings的用法,雖然網(wǎng)上和MSDN上對其的介紹已經是多如牛毛: /* * 第一個值:要綁定到TextBox的什么地方 * 第二個值:數(shù)據(jù)源是什么 * 第三個值:應該取數(shù)據(jù)源的什么屬性 * 第四個值:是否開啟數(shù)據(jù)格式化 * 第五個值:在什么時候啟用數(shù)據(jù)源綁定 * */ textBox1.DataBindings.Add("Text", trackBar1, "Value", false, DataSourceU

4、pdateMode.OnPropertyChanged);上面只是一種最簡便的方式,但是我們能不能綁定自己定義的類,把自定義類當做數(shù)據(jù)源呢?當然能。DataBindings能夠接受任意類型的Object類型的數(shù)據(jù)源。定義類如下: public class MyDataSource public string Myvalue get; set; 然后我們在代碼中可以按照如下方式綁定: MyDataSource mydatasource = new MyDataSource(); /應用于第二種方式 private void mainFrm_Load(object sender, EventArg

5、s e) /* * 這個主要就是通過一個外部的類,當做數(shù)據(jù)源 * */ mydatasource.Myvalue = "這是個測試" textBox2.DataBindings.Add("Text",mydatasource,"Myvalue",false,DataSourceUpdateMode.OnPropertyChanged);那么,當我們在界面上看的時候,就會發(fā)現(xiàn),textBox2中顯示的是“這是個測試”五個字。但是,有時候定義類太麻煩,能不能通過給定的屬性來充當數(shù)據(jù)源呢?這個當然也能,這樣的方式,只適合在一些應用很簡單的場

6、合,可以按照如下方式綁定: public int Num get; set; /應用于第三種方式 private void mainFrm_Load(object sender, EventArgs e) /* *這個主要就是通過本身擁有的屬性,當做數(shù)據(jù)源 */ Num = 5; textBox3.DataBindings.Add("Text",this,"Num", false,DataSourceUpdateMode.OnPropertyChanged); 這樣,我們就可以把一個類內部的屬性當做數(shù)據(jù)源來使用了。需要注意的是,之所以利用this來充當數(shù)

7、據(jù)源,是因為窗體他本身就是一個類,Num充當了這個類中的屬性而已。接下來,我們就需要說到重頭戲了,DataGridView的表現(xiàn)形式。對于這個數(shù)據(jù)控件,我相信大家都不會陌生,但是如何實現(xiàn)自定義的數(shù)據(jù)綁定呢?請看代碼:這里我們首先應該定義一個Model類,以便保存數(shù)據(jù): public class BlogNew public int BlogID get; set; public string BlogTitle get; set; 然后我們利用List<T>泛型來保存數(shù)據(jù),最后是將這個數(shù)據(jù)源綁定到dataGridView1控件上: public List<BlogNew>

8、; 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

9、,BlogTitle="最喜歡納蘭性德"); dataGridView1.DataBindings.Add("DataSource", this, "blogNews", false, DataSourceUpdateMode.OnPropertyChanged); 這樣綁定完畢以后,在界面上,我們可以非常自豪的看到自己新加的三條數(shù)據(jù)。當然,這個沒有什么奇怪的。需要注意的是,在這里,我們設置了DataSourceUpdateMode.OnPropertyChanged,也就是說,當數(shù)據(jù)源的改變的時候,數(shù)據(jù)將重新加載,那么為了測試數(shù)據(jù)能

10、不能夠自動重新加載(不需要重新綁定數(shù)據(jù)源),我們來做個測試,界面上加一個按鈕,用來添加一條新的記錄: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 dataGridVi

11、ew1.DataSource as List<BlogNew>) /* * 當我們心插入一條BlogID記錄為4的數(shù)據(jù)的時候,在界面上可以看出dataGridView1的dataSource已經被更新, * 但是界面上依舊顯示為BlogID為1,2,3三條數(shù)據(jù),很奇怪 * */ MessageBox.Show(blogNew.BlogID + "-" + blogNew.BlogTitle); 好了,這里我添加了一條新的數(shù)據(jù),并且沒有進行數(shù)據(jù)重新綁定,點擊按鈕,但是悲劇發(fā)生了,界面上沒有任何新的記錄出現(xiàn),怎么回事?但是通過foreach循環(huán),我們發(fā)現(xiàn)第四條記錄明

12、明被添加到數(shù)據(jù)源中了呀?怎么回事呢?其實我這里也沒有搞明白到底為什么,還請大家指教,要解決這個問題,我們應該利用BindingList<T>泛型類來替換掉List<T>泛型類: public BindingList<BlogNew> blogNewsRegardUI get;set; /應用于DataGridView界面UI更新 private void mainFrm_Load(object sender, EventArgs e) blogNewsRegardUI = new BindingList<BlogNew>(); blogNewsR

13、egardUI.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, "

14、;blogNewsRegardUI", false, DataSourceUpdateMode.OnPropertyChanged); private void button4_Click(object sender, EventArgs e) /*這里主要用來解決DataGridView1界面不更新的問題,其實原因在于使用了List<BlogNew>,這里我們采用BindList<BlogNew> *通過測試,我們發(fā)現(xiàn),只要數(shù)據(jù)源改變,界面就可以自動的進行更新了,很是方便,不需要重新綁定 */ var dataRegardUI = dataGridView2

15、.DataSource as BindingList<BlogNew> dataRegardUI.Add(new BlogNew BlogID = 20, BlogTitle = "竹外桃花三兩枝,春江水暖鴨先知" ); 然后當我們再點擊添加按鈕的時候,我們發(fā)現(xiàn),雖然我們沒有重新綁定數(shù)據(jù)源(只是數(shù)據(jù)源有所改變),就導致界面正確的添加進去數(shù)據(jù)了。呵呵,希望有用,謝謝,下面附上截圖和全部代碼:using System;using System.Collections.Generic;using System.ComponentModel;using System.D

16、ata;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 L

17、ist<BlogNew> blogNews get; set; /應用于第四種方式 public BindingList<BlogNew> blogNewsRegardUI get;set; /應用于DataGridView界面UI更新 private void mainFrm_Load(object sender, EventArgs e) #region 測試一 /* * 第一個值:要綁定到TextBox的什么地方 * 第二個值:數(shù)據(jù)源是什么 * 第三個值:應該取數(shù)據(jù)源的什么屬性 * 第四個值:是否開啟數(shù)據(jù)格式化 * 第五個值:在什么時候啟用數(shù)據(jù)源綁定 * */ t

18、extBox1.DataBindings.Add("Text", trackBar1, "Value", false, DataSourceUpdateMode.OnPropertyChanged); #endregion #region 測試二 /* * 這個主要就是通過一個外部的類,當做數(shù)據(jù)源 * */ mydatasource.Myvalue = "這是個測試" textBox2.DataBindings.Add("Text",mydatasource,"Myvalue",false,Da

19、taSourceUpdateMode.OnPropertyChanged); #endregion #region 測試三 /* *這個主要就是通過本身擁有的屬性,當做數(shù)據(jù)源 */ Num = 5; textBox3.DataBindings.Add("Text",this,"Num", false,DataSourceUpdateMode.OnPropertyChanged); #endregion #region 測試四 : List<T> blogNews = new List<BlogNew>(); blogNews.Ad

20、d(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, DataSourceU

21、pdateMode.OnPropertyChanged); #endregion #region 測試五 : BindingList<T> blogNewsRegardUI = new BindingList<BlogNew>(); blogNewsRegardUI.Add(new BlogNew BlogID = 11, BlogTitle = "僵臥孤村不自哀" ); blogNewsRegardUI.Add(new BlogNew BlogID = 12, BlogTitle = "尚思為國戍輪臺" ); blogNewsR

22、egardUI.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中的值

23、,這里的值也改變了,原因是因為類屬于引用類型 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 = "取次花

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論