




版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、Control.DataBinding數(shù)據(jù)綁定細(xì)解在C#操作數(shù)據(jù)庫(kù)過(guò)程中,針對(duì)一般的文本控件,比如TextBox,Label等,我們賦值直接使用類(lèi)似TextBox.Text=*的方式來(lái)進(jìn)行,這種方式從某種意義上來(lái)說(shuō)的確是最簡(jiǎn)便的方式,但是對(duì)于復(fù)雜一些的空間,比如說(shuō)DataGridView,這個(gè)時(shí)候,綁定數(shù)據(jù)源我們一般使用DataGridView1.DataSource=*的方式來(lái)進(jìn)行,如果數(shù)據(jù)源稍微有更改,那么只需要重新調(diào)用綁定一遍即可??梢哉f(shuō)這種方式是單向的,也即從數(shù)據(jù)庫(kù)到UI,但是有沒(méi)有一種方式能夠?qū)崿F(xiàn)數(shù)據(jù)源改變的時(shí)候,不用重新綁定DataGridView就讓它能夠自動(dòng)刷新數(shù)據(jù)呢,當(dāng)然,這
2、里要提到的就是DataBinding了。下面來(lái)一步一步的進(jìn)行。首先來(lái)看看示例一,主要是利用TextBox的DataBindings方式來(lái)進(jìn)行數(shù)據(jù)綁定:在界面上放置一個(gè)TextBox,名稱(chēng)為textBox1,再放置一個(gè)TrackBar,名稱(chēng)為trackBar1,然后編寫(xiě)綁定代碼如下:textBox1.DataBindings.Add("Text", trackBar1, "Value", false, DataSourceUpdateMode.OnPropertyChanged);這樣,我們就可以非常明顯的看到,當(dāng)textBox1文本框里面的值改變的時(shí)候,
3、trackBar1的值跟著改變;當(dāng)trackBar1的值改變的時(shí)候,文本框中的值也跟著改變,看來(lái),這種改變是雙向的。在這里我要啰嗦下DataBindings的用法,雖然網(wǎng)上和MSDN上對(duì)其的介紹已經(jīng)是多如牛毛: /* * 第一個(gè)值:要綁定到TextBox的什么地方 * 第二個(gè)值:數(shù)據(jù)源是什么 * 第三個(gè)值:應(yīng)該取數(shù)據(jù)源的什么屬性 * 第四個(gè)值:是否開(kāi)啟數(shù)據(jù)格式化 * 第五個(gè)值:在什么時(shí)候啟用數(shù)據(jù)源綁定 * */ textBox1.DataBindings.Add("Text", trackBar1, "Value", false, DataSourceU
4、pdateMode.OnPropertyChanged);上面只是一種最簡(jiǎn)便的方式,但是我們能不能綁定自己定義的類(lèi),把自定義類(lèi)當(dāng)做數(shù)據(jù)源呢?當(dāng)然能。DataBindings能夠接受任意類(lèi)型的Object類(lèi)型的數(shù)據(jù)源。定義類(lèi)如下: public class MyDataSource public string Myvalue get; set; 然后我們?cè)诖a中可以按照如下方式綁定: MyDataSource mydatasource = new MyDataSource(); /應(yīng)用于第二種方式 private void mainFrm_Load(object sender, EventArg
5、s e) /* * 這個(gè)主要就是通過(guò)一個(gè)外部的類(lèi),當(dāng)做數(shù)據(jù)源 * */ mydatasource.Myvalue = "這是個(gè)測(cè)試" textBox2.DataBindings.Add("Text",mydatasource,"Myvalue",false,DataSourceUpdateMode.OnPropertyChanged);那么,當(dāng)我們?cè)诮缑嫔峡吹臅r(shí)候,就會(huì)發(fā)現(xiàn),textBox2中顯示的是“這是個(gè)測(cè)試”五個(gè)字。但是,有時(shí)候定義類(lèi)太麻煩,能不能通過(guò)給定的屬性來(lái)充當(dāng)數(shù)據(jù)源呢?這個(gè)當(dāng)然也能,這樣的方式,只適合在一些應(yīng)用很簡(jiǎn)單的場(chǎng)
6、合,可以按照如下方式綁定: public int Num get; set; /應(yīng)用于第三種方式 private void mainFrm_Load(object sender, EventArgs e) /* *這個(gè)主要就是通過(guò)本身?yè)碛械膶傩?,?dāng)做數(shù)據(jù)源 */ Num = 5; textBox3.DataBindings.Add("Text",this,"Num", false,DataSourceUpdateMode.OnPropertyChanged); 這樣,我們就可以把一個(gè)類(lèi)內(nèi)部的屬性當(dāng)做數(shù)據(jù)源來(lái)使用了。需要注意的是,之所以利用this來(lái)充當(dāng)數(shù)
7、據(jù)源,是因?yàn)榇绑w他本身就是一個(gè)類(lèi),Num充當(dāng)了這個(gè)類(lèi)中的屬性而已。接下來(lái),我們就需要說(shuō)到重頭戲了,DataGridView的表現(xiàn)形式。對(duì)于這個(gè)數(shù)據(jù)控件,我相信大家都不會(huì)陌生,但是如何實(shí)現(xiàn)自定義的數(shù)據(jù)綁定呢?請(qǐng)看代碼:這里我們首先應(yīng)該定義一個(gè)Model類(lèi),以便保存數(shù)據(jù): public class BlogNew public int BlogID get; set; public string BlogTitle get; set; 然后我們利用List<T>泛型來(lái)保存數(shù)據(jù),最后是將這個(gè)數(shù)據(jù)源綁定到dataGridView1控件上: public List<BlogNew>
8、; blogNews get; set; /應(yīng)用于第四種方式 private void mainFrm_Load(object sender, EventArgs e) blogNews = new List<BlogNew>(); blogNews.Add(new BlogNew BlogID = 1, BlogTitle = "人生若只如初見(jiàn)" ); blogNews.Add(new BlogNew BlogID = 2, BlogTitle = "何事秋風(fēng)悲畫(huà)扇" ); blogNews.Add(new BlogNew BlogID=3
9、,BlogTitle="最喜歡納蘭性德"); dataGridView1.DataBindings.Add("DataSource", this, "blogNews", false, DataSourceUpdateMode.OnPropertyChanged); 這樣綁定完畢以后,在界面上,我們可以非常自豪的看到自己新加的三條數(shù)據(jù)。當(dāng)然,這個(gè)沒(méi)有什么奇怪的。需要注意的是,在這里,我們?cè)O(shè)置了DataSourceUpdateMode.OnPropertyChanged,也就是說(shuō),當(dāng)數(shù)據(jù)源的改變的時(shí)候,數(shù)據(jù)將重新加載,那么為了測(cè)試數(shù)據(jù)能
10、不能夠自動(dòng)重新加載(不需要重新綁定數(shù)據(jù)源),我們來(lái)做個(gè)測(cè)試,界面上加一個(gè)按鈕,用來(lái)添加一條新的記錄: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>) /* * 當(dāng)我們心插入一條BlogID記錄為4的數(shù)據(jù)的時(shí)候,在界面上可以看出dataGridView1的dataSource已經(jīng)被更新, * 但是界面上依舊顯示為BlogID為1,2,3三條數(shù)據(jù),很奇怪 * */ MessageBox.Show(blogNew.BlogID + "-" + blogNew.BlogTitle); 好了,這里我添加了一條新的數(shù)據(jù),并且沒(méi)有進(jìn)行數(shù)據(jù)重新綁定,點(diǎn)擊按鈕,但是悲劇發(fā)生了,界面上沒(méi)有任何新的記錄出現(xiàn),怎么回事?但是通過(guò)foreach循環(huán),我們發(fā)現(xiàn)第四條記錄明
12、明被添加到數(shù)據(jù)源中了呀?怎么回事呢?其實(shí)我這里也沒(méi)有搞明白到底為什么,還請(qǐng)大家指教,要解決這個(gè)問(wèn)題,我們應(yīng)該利用BindingList<T>泛型類(lèi)來(lái)替換掉List<T>泛型類(lèi): public BindingList<BlogNew> blogNewsRegardUI get;set; /應(yīng)用于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 = "尚思為國(guó)戍輪臺(tái)" ); blogNewsRegardUI.Add(new BlogNew BlogID = 13, BlogTitle = "夜闌臥聽(tīng)風(fēng)吹雨" ); dataGridView2.DataBindings.Add("DataSource", this, "
14、;blogNewsRegardUI", false, DataSourceUpdateMode.OnPropertyChanged); private void button4_Click(object sender, EventArgs e) /*這里主要用來(lái)解決DataGridView1界面不更新的問(wèn)題,其實(shí)原因在于使用了List<BlogNew>,這里我們采用BindList<BlogNew> *通過(guò)測(cè)試,我們發(fā)現(xiàn),只要數(shù)據(jù)源改變,界面就可以自動(dòng)的進(jìn)行更新了,很是方便,不需要重新綁定 */ var dataRegardUI = dataGridView2
15、.DataSource as BindingList<BlogNew> dataRegardUI.Add(new BlogNew BlogID = 20, BlogTitle = "竹外桃花三兩枝,春江水暖鴨先知" ); 然后當(dāng)我們?cè)冱c(diǎn)擊添加按鈕的時(shí)候,我們發(fā)現(xiàn),雖然我們沒(méi)有重新綁定數(shù)據(jù)源(只是數(shù)據(jù)源有所改變),就導(dǎo)致界面正確的添加進(jìn)去數(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(); /應(yīng)用于第二種方式 public int Num get; set; /應(yīng)用于第三種方式 public L
17、ist<BlogNew> blogNews get; set; /應(yīng)用于第四種方式 public BindingList<BlogNew> blogNewsRegardUI get;set; /應(yīng)用于DataGridView界面UI更新 private void mainFrm_Load(object sender, EventArgs e) #region 測(cè)試一 /* * 第一個(gè)值:要綁定到TextBox的什么地方 * 第二個(gè)值:數(shù)據(jù)源是什么 * 第三個(gè)值:應(yīng)該取數(shù)據(jù)源的什么屬性 * 第四個(gè)值:是否開(kāi)啟數(shù)據(jù)格式化 * 第五個(gè)值:在什么時(shí)候啟用數(shù)據(jù)源綁定 * */ t
18、extBox1.DataBindings.Add("Text", trackBar1, "Value", false, DataSourceUpdateMode.OnPropertyChanged); #endregion #region 測(cè)試二 /* * 這個(gè)主要就是通過(guò)一個(gè)外部的類(lèi),當(dāng)做數(shù)據(jù)源 * */ mydatasource.Myvalue = "這是個(gè)測(cè)試" textBox2.DataBindings.Add("Text",mydatasource,"Myvalue",false,Da
19、taSourceUpdateMode.OnPropertyChanged); #endregion #region 測(cè)試三 /* *這個(gè)主要就是通過(guò)本身?yè)碛械膶傩?,?dāng)做數(shù)據(jù)源 */ Num = 5; textBox3.DataBindings.Add("Text",this,"Num", false,DataSourceUpdateMode.OnPropertyChanged); #endregion #region 測(cè)試四 : List<T> blogNews = new List<BlogNew>(); blogNews.Ad
20、d(new BlogNew BlogID = 1, BlogTitle = "人生若只如初見(jiàn)" ); blogNews.Add(new BlogNew BlogID = 2, BlogTitle = "何事秋風(fēng)悲畫(huà)扇" ); blogNews.Add(new BlogNew BlogID=3,BlogTitle="最喜歡納蘭性德"); dataGridView1.DataBindings.Add("DataSource", this, "blogNews", false, DataSourceU
21、pdateMode.OnPropertyChanged); #endregion #region 測(cè)試五 : BindingList<T> blogNewsRegardUI = new BindingList<BlogNew>(); blogNewsRegardUI.Add(new BlogNew BlogID = 11, BlogTitle = "僵臥孤村不自哀" ); blogNewsRegardUI.Add(new BlogNew BlogID = 12, BlogTitle = "尚思為國(guó)戍輪臺(tái)" ); blogNewsR
22、egardUI.Add(new BlogNew BlogID = 13, BlogTitle = "夜闌臥聽(tīng)風(fēng)吹雨" ); dataGridView2.DataBindings.Add("DataSource", this, "blogNewsRegardUI", false, DataSourceUpdateMode.OnPropertyChanged); #endregion private void button1_Click(object sender, EventArgs e) /從這里可以看出,改變了TextBox2中的值
23、,這里的值也改變了,原因是因?yàn)轭?lèi)屬于引用類(lèi)型 MessageBox.Show(mydatasource.Myvalue); private void button2_Click(object sender, EventArgs e) /從這里可以看出,改變了TextBox3中的值,這里的值也改變了, /原因是Num被當(dāng)做了當(dāng)前窗體的一個(gè)屬性(窗體本身就是一個(gè)類(lèi)),也屬于引用類(lèi)型 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. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度房地產(chǎn)項(xiàng)目增資入股投資協(xié)議
- 二零二五年度辦公室文員聘用與企業(yè)文化融合協(xié)議
- 二零二五年度新能源汽車(chē)碰撞責(zé)任免除合同
- 2025年度現(xiàn)代農(nóng)業(yè)病蟲(chóng)害防治藥害賠償協(xié)議書(shū)
- 二零二五年度勞動(dòng)局標(biāo)準(zhǔn)合同:養(yǎng)老服務(wù)業(yè)員工就業(yè)保障協(xié)議范本
- 2025年度賬戶(hù)變更補(bǔ)充服務(wù)協(xié)議
- 高性能計(jì)算中心設(shè)備采購(gòu)及安裝合同
- 企業(yè)辦公室裝飾設(shè)計(jì)與施工服務(wù)合同
- 教育培訓(xùn)行業(yè)線上課程開(kāi)發(fā)與運(yùn)營(yíng)計(jì)劃書(shū)
- 電氣設(shè)備安裝工程施工合同新
- 祥康健康快車(chē)王晗老師講座收集驗(yàn)方
- 禮儀與教化 課件-2023-2024學(xué)年高中美術(shù)湘美版(2019)美術(shù)鑒賞
- 新生兒早期基本保健課件
- 采礦學(xué)課程設(shè)計(jì)硯北煤礦新井設(shè)計(jì)全套圖紙
- 第19章-城市設(shè)計(jì)課件
- 人事管理管理制度
- 大型儲(chǔ)罐計(jì)算書(shū)
- 2022-2023學(xué)年廣東省廣州市荔灣區(qū)統(tǒng)考初三第一次??紨?shù)學(xué)試題含解析
- 針對(duì)本項(xiàng)目售后服務(wù)方案
- 2022年桂林電子科技大學(xué)高等學(xué)歷繼續(xù)教育學(xué)士學(xué)位英語(yǔ)考試真
- 新人教版七至九年級(jí)英語(yǔ)單詞表 漢譯英(含音標(biāo))
評(píng)論
0/150
提交評(píng)論