日韩天天综合网_野战两个奶头被亲到高潮_亚洲日韩欧美精品综合_av女人天堂污污污_视频一区**字幕无弹窗_国产亚洲欧美小视频_国内性爱精品在线免费视频_国产一级电影在线播放_日韩欧美内地福利_亚洲一二三不卡片区

注意ADO.NET中容易混淆的概念(5)_.Net教程

編輯Tag賺U幣
教程Tag:暫無Tag,歡迎添加,賺取U幣!

推薦:解析asp.net開發(fā)與web標(biāo)準(zhǔn)的沖突問題
Visual Studio .net從2003到現(xiàn)在的2008,一路走來慢慢強(qiáng)大從以前的vs2003能自動(dòng)改亂你的html代碼到現(xiàn)在在vs2008中都能直接對html代碼進(jìn)行w3c標(biāo)準(zhǔn)驗(yàn)證并提示了,非常不易。 論壇中也經(jīng)常有從事.net開發(fā)的新手朋友問一些ASP.net開發(fā)過程中與Web標(biāo)準(zhǔn)之間的沖突

型。事實(shí)上,控件上的任何屬性都可以綁定到數(shù)據(jù)庫中的字段。

復(fù)雜數(shù)據(jù)綁定

復(fù)雜數(shù)據(jù)綁定指將一個(gè)控件綁定到多個(gè)數(shù)據(jù)元素的能力,通常綁定到數(shù)據(jù)庫中的多條記錄,或者綁定到多個(gè)任何其他類型的可綁定數(shù)據(jù)元素,一般是綁定到一個(gè)DataView。支持復(fù)雜綁定的控件的示例有DataGrid、ListBox 和 ErrorProvider 控件。

一般DataGrid控件都是跟一個(gè)DataView綁定,DataGrid的數(shù)據(jù)綁定屬于復(fù)雜綁定,因?yàn)樗壎ǖ接卸鄺l記錄的表,DataGrid有兩個(gè)屬性同數(shù)據(jù)綁定有關(guān):

DataGrid.DataSource 屬性:獲取或設(shè)置DataGrid所顯示數(shù)據(jù)的數(shù)據(jù)源。一般是跟DataTable 、DataView 、DataSet 綁定,如果DataSource設(shè)定為DataSet,則引用包含的表不止一個(gè),則必須向 DataMember 屬性設(shè)置一個(gè)字符串,該字符串指定要綁定到的表。

DataGrid.DataMember 屬性:獲取或設(shè)置 DataSource中的特定列表,就是上述DataSource設(shè)定為DataSet時(shí),要設(shè)定此屬性來指定要綁定到的表。

經(jīng)常有這種需求,一個(gè)窗體中有一個(gè)DataGrid,顯示了一些數(shù)據(jù),窗體上還有一些TextBox控件,用來顯示DataGrid中的當(dāng)前行的數(shù)據(jù),一個(gè)TextBox控件對應(yīng)DataGrid行的一個(gè)列,當(dāng)DataGrid的當(dāng)前行移動(dòng)時(shí),TextBox控件中的值也會(huì)跟著顯示改變后的DataGrid的當(dāng)前行。

要保證這些數(shù)據(jù)綁定控件保持同步就要一個(gè)統(tǒng)一管理數(shù)據(jù)綁定的機(jī)制來保證這些控件的同步,DotNet中負(fù)責(zé)數(shù)據(jù)同步的是BindingManagerBase,它是用來管理數(shù)據(jù)源的,綁定到同一個(gè)數(shù)據(jù)源的數(shù)據(jù)綁定控件都可以由BindingManagerBase統(tǒng)一管理。BindingManagerBase可以由Form.BindingContext.Item屬性獲得,此屬性有兩種重載:

public BindingManagerBase this[object DataSource]

//獲取與指定數(shù)據(jù)源關(guān)聯(lián)的 BindingManagerBase

public BindingManagerBase this[object DataSource, string DataMember]

//獲取與指定數(shù)據(jù)源和數(shù)據(jù)成員相關(guān)聯(lián)的一個(gè) BindingManagerBase

所有的數(shù)據(jù)綁定控件的數(shù)據(jù)源同建立BindingManagerBase時(shí)傳遞的對象一樣的,都將屬于這個(gè)BindingManagerBase管理,比如,建立一個(gè)如下的BindingManagerBase:

BindingManagerBase myBindingManagerBaseParent = this.BindingContext[myDataSet,"customers"];

如果Form上有個(gè)DataGrid的DataGrid.DataSource = myDataSet;DataGrid.DataMember = "customers",那么這個(gè)DataGrid的數(shù)據(jù)源就在myBindingManagerBaseParent的管理之下了。

同樣簡單數(shù)據(jù)綁定的控件的DataSource也是跟 BindingManagerBase的DataSource一樣,DataMember是BindingManagerBase的DataMember指定的那個(gè)表的某一列時(shí),這個(gè)控件的數(shù)據(jù)源也在這個(gè)myBindingManagerBaseParent管理之下了:

dataGrid1.DataSource = myDataSet;

dataGrid1.DataMember = "customers";

textCustomerId.DataBindings.Add

(new Binding("Text",myDataSet,"customers.customerid"));

//TextBox的Text屬性跟

//myDataSet的customers表的customerid字段綁定

BindingManagerBase控制的數(shù)據(jù)源有個(gè)當(dāng)前行的概念,控件一旦跟數(shù)據(jù)源綁定后,DataGrid將顯示數(shù)據(jù)源表的所有數(shù)據(jù),不過在DataGrid的行標(biāo)頭里有個(gè)黑色的三角箭頭用來指示當(dāng)前行。簡單綁定控件中顯示的值將是數(shù)據(jù)源當(dāng)前行的內(nèi)容。

所以,只要我們改變BindingManagerBase的指針就行了,這個(gè)可以在界面上通過點(diǎn)擊要到的那一行來改變當(dāng)前行,也可以在程序中改變當(dāng)前行的設(shè)置:

myBindingManagerBaseParent.Position = 10;

BindingManagerBase.Position屬性的變化就會(huì)引起B(yǎng)indingManagerBase當(dāng)前行的變化,也就是跟這個(gè)數(shù)據(jù)源綁定的DataGrid的當(dāng)前行的變化,簡單綁定控件的顯示內(nèi)容也就隨之改變了。

BindingManagerBase的DataSource可以是DataSet,DataSet中可以有多個(gè)DataTable,這些DataTable可以通過DataRelaton(關(guān)系)聯(lián)系在一起,形成父表/子表的關(guān)系。比如,還是上面舉過的例子,一個(gè)DataGrid顯示Customer表,同時(shí)還想要有一個(gè)DataGrid來顯示當(dāng)前Customer所有的order。這樣我們就會(huì)需要兩個(gè)BindingManagerBase了,一個(gè)BindingManagerBase對應(yīng)Customer表,另一個(gè)BindingManagerBase對應(yīng)order表,而且這個(gè)order表還要考慮到同Customer表的關(guān)系。

對應(yīng)Customer的BindingManagerBase上面我們已經(jīng)建立好了,下面我們來建立對應(yīng)order的BindingManagerBase:

首先我們要建立Customer表和order表之間的關(guān)系myRelation:

DataColumn ParentColumn = myDataSet.Tables["customers"].Columns["customerid"];

//要建立關(guān)系的父表的列,相當(dāng)于主鍵

DataColumn ChildColumn = myDataSet.Tables["orders"].Columns["customerid"];

//要建立關(guān)系的子表的列,相當(dāng)于外鍵

DataRelation myRelation = new DataRelation("myRelation",ParentColumn,ChildColumn,false);

//根據(jù)父表,子表的相關(guān)列建立關(guān)系

然后,通過關(guān)系,建立對應(yīng)order表的BindingManagerBase:

myBindingManagerBaseChild = this.BindingContext[myDataSet,"customers.myRelation"]; //這個(gè)數(shù)據(jù)源將解析為一個(gè)父表中的客戶對應(yīng)的所有的order

這樣,當(dāng)對應(yīng)Customer的BindingManagerBase的當(dāng)前行改變時(shí),對應(yīng)order的BindingManagerBase也將跟著變化,他們之間的關(guān)系是由myRelation決定的

◆ 在程序中訪問DataGrid中的內(nèi)容

DataTable中有數(shù)據(jù)行DataRow,而在DataGrid中沒有行這個(gè)對象,這讓人感到很不習(xí)慣,也覺得不夠自然。在DataTable中,一張表的層次結(jié)構(gòu)很清楚,DataTable.Rows屬性可以得到這張表所包含的所有行的行集,通過行集的索引DataRowCollection[index]就可以得到具體的一個(gè)DataRow,數(shù)據(jù)行的索引DataRow[index]又可以得到這一行的具體某一列的內(nèi)容。

而DataGrid中就沒有這么方便了,DataGrid只有兩個(gè)屬性可用,DataGrid.CurrentCell 屬性,此屬性返回一個(gè)DataGridCell類型的結(jié)構(gòu),DataGridCell結(jié)構(gòu)指明此Cell所在的行號和列號。還有一個(gè)DataGrid.Item 屬性,此屬性有兩個(gè)重載:

public object this[DataGridCell] //獲取或設(shè)置指定的 DataGridCell 的值

public object this[int, int] //獲取或設(shè)置位于指定行和列的單元格的值

可見,DataGrid中訪問都是針對某個(gè)Cell進(jìn)行的。經(jīng)常的,我們需要從當(dāng)前的Cell獲得此Cell所對應(yīng)的DataRow,比如界面中可能先選中DataGrid的某一行,或者某一個(gè)Cell,然后點(diǎn)擊一個(gè)按鈕,彈出一個(gè)新的窗口,窗口中顯示這一行的所有單元的內(nèi)容,并允許修改單元的值,最后保存關(guān)閉窗口。這就需要從當(dāng)前的DataGrid所在的單元找到其所對應(yīng)的DataTable所在的行和列。

而DataGrid中顯示的數(shù)據(jù)可能經(jīng)過DataView的DataView.RowFilter屬性、DataView.RowStateFilter屬性的過濾,還可能經(jīng)過DataGrid本身根據(jù)各個(gè)列的正向和反向排序,所以DataGrid的CurrentRowIndex屬性所指示的行索引跟其對應(yīng)的DataTable的行索引有很大的機(jī)會(huì)是不一樣的,不能夠根據(jù)DataGrid的CurrentRowIndex去獲取其對應(yīng)的

分享:ASP.NET程序設(shè)計(jì)的10大技巧
1. 在使用Visual Studio .NET時(shí),除直接或非引用的對象外,不要使用缺省的名字 .NET帶來的好處之一是所有的源代碼和配置文件都是純文本文件,能夠使用Notepad或WordPad等任意的文本編輯器進(jìn)行編輯。如果不愿意,我們并非一定要使用Visual Studio .NET作為集

來源:模板無憂//所屬分類:.Net教程/更新時(shí)間:2009-06-11
相關(guān).Net教程