注意ADO.NET中容易混淆的概念(5)_.Net教程
推薦:解析asp.net開發與web標準的沖突問題Visual Studio .net從2003到現在的2008,一路走來慢慢強大從以前的vs2003能自動改亂你的html代碼到現在在vs2008中都能直接對html代碼進行w3c標準驗證并提示了,非常不易。 論壇中也經常有從事.net開發的新手朋友問一些ASP.net開發過程中與Web標準之間的沖突
型。事實上,控件上的任何屬性都可以綁定到數據庫中的字段。
復雜數據綁定
復雜數據綁定指將一個控件綁定到多個數據元素的能力,通常綁定到數據庫中的多條記錄,或者綁定到多個任何其他類型的可綁定數據元素,一般是綁定到一個DataView。支持復雜綁定的控件的示例有DataGrid、ListBox 和 ErrorProvider 控件。
一般DataGrid控件都是跟一個DataView綁定,DataGrid的數據綁定屬于復雜綁定,因為它綁定到有多條記錄的表,DataGrid有兩個屬性同數據綁定有關:
DataGrid.DataSource 屬性:獲取或設置DataGrid所顯示數據的數據源。一般是跟DataTable 、DataView 、DataSet 綁定,如果DataSource設定為DataSet,則引用包含的表不止一個,則必須向 DataMember 屬性設置一個字符串,該字符串指定要綁定到的表。
DataGrid.DataMember 屬性:獲取或設置 DataSource中的特定列表,就是上述DataSource設定為DataSet時,要設定此屬性來指定要綁定到的表。
經常有這種需求,一個窗體中有一個DataGrid,顯示了一些數據,窗體上還有一些TextBox控件,用來顯示DataGrid中的當前行的數據,一個TextBox控件對應DataGrid行的一個列,當DataGrid的當前行移動時,TextBox控件中的值也會跟著顯示改變后的DataGrid的當前行。
要保證這些數據綁定控件保持同步就要一個統一管理數據綁定的機制來保證這些控件的同步,DotNet中負責數據同步的是BindingManagerBase,它是用來管理數據源的,綁定到同一個數據源的數據綁定控件都可以由BindingManagerBase統一管理。BindingManagerBase可以由Form.BindingContext.Item屬性獲得,此屬性有兩種重載:
public BindingManagerBase this[object DataSource]
//獲取與指定數據源關聯的 BindingManagerBase
public BindingManagerBase this[object DataSource, string DataMember]
//獲取與指定數據源和數據成員相關聯的一個 BindingManagerBase
所有的數據綁定控件的數據源同建立BindingManagerBase時傳遞的對象一樣的,都將屬于這個BindingManagerBase管理,比如,建立一個如下的BindingManagerBase:
BindingManagerBase myBindingManagerBaseParent = this.BindingContext[myDataSet,"customers"];
如果Form上有個DataGrid的DataGrid.DataSource = myDataSet;DataGrid.DataMember = "customers",那么這個DataGrid的數據源就在myBindingManagerBaseParent的管理之下了。
同樣簡單數據綁定的控件的DataSource也是跟 BindingManagerBase的DataSource一樣,DataMember是BindingManagerBase的DataMember指定的那個表的某一列時,這個控件的數據源也在這個myBindingManagerBaseParent管理之下了:
dataGrid1.DataSource = myDataSet;
dataGrid1.DataMember = "customers";
textCustomerId.DataBindings.Add
(new Binding("Text",myDataSet,"customers.customerid"));
//TextBox的Text屬性跟
//myDataSet的customers表的customerid字段綁定
BindingManagerBase控制的數據源有個當前行的概念,控件一旦跟數據源綁定后,DataGrid將顯示數據源表的所有數據,不過在DataGrid的行標頭里有個黑色的三角箭頭用來指示當前行。簡單綁定控件中顯示的值將是數據源當前行的內容。
所以,只要我們改變BindingManagerBase的指針就行了,這個可以在界面上通過點擊要到的那一行來改變當前行,也可以在程序中改變當前行的設置:
myBindingManagerBaseParent.Position = 10;
BindingManagerBase.Position屬性的變化就會引起BindingManagerBase當前行的變化,也就是跟這個數據源綁定的DataGrid的當前行的變化,簡單綁定控件的顯示內容也就隨之改變了。
BindingManagerBase的DataSource可以是DataSet,DataSet中可以有多個DataTable,這些DataTable可以通過DataRelaton(關系)聯系在一起,形成父表/子表的關系。比如,還是上面舉過的例子,一個DataGrid顯示Customer表,同時還想要有一個DataGrid來顯示當前Customer所有的order。這樣我們就會需要兩個BindingManagerBase了,一個BindingManagerBase對應Customer表,另一個BindingManagerBase對應order表,而且這個order表還要考慮到同Customer表的關系。
對應Customer的BindingManagerBase上面我們已經建立好了,下面我們來建立對應order的BindingManagerBase:
首先我們要建立Customer表和order表之間的關系myRelation:
DataColumn ParentColumn = myDataSet.Tables["customers"].Columns["customerid"];
//要建立關系的父表的列,相當于主鍵
DataColumn ChildColumn = myDataSet.Tables["orders"].Columns["customerid"];
//要建立關系的子表的列,相當于外鍵
DataRelation myRelation = new DataRelation("myRelation",ParentColumn,ChildColumn,false);
//根據父表,子表的相關列建立關系
然后,通過關系,建立對應order表的BindingManagerBase:
myBindingManagerBaseChild = this.BindingContext[myDataSet,"customers.myRelation"]; //這個數據源將解析為一個父表中的客戶對應的所有的order
這樣,當對應Customer的BindingManagerBase的當前行改變時,對應order的BindingManagerBase也將跟著變化,他們之間的關系是由myRelation決定的
◆ 在程序中訪問DataGrid中的內容
DataTable中有數據行DataRow,而在DataGrid中沒有行這個對象,這讓人感到很不習慣,也覺得不夠自然。在DataTable中,一張表的層次結構很清楚,DataTable.Rows屬性可以得到這張表所包含的所有行的行集,通過行集的索引DataRowCollection[index]就可以得到具體的一個DataRow,數據行的索引DataRow[index]又可以得到這一行的具體某一列的內容。
而DataGrid中就沒有這么方便了,DataGrid只有兩個屬性可用,DataGrid.CurrentCell 屬性,此屬性返回一個DataGridCell類型的結構,DataGridCell結構指明此Cell所在的行號和列號。還有一個DataGrid.Item 屬性,此屬性有兩個重載:
public object this[DataGridCell] //獲取或設置指定的 DataGridCell 的值
public object this[int, int] //獲取或設置位于指定行和列的單元格的值
可見,DataGrid中訪問都是針對某個Cell進行的。經常的,我們需要從當前的Cell獲得此Cell所對應的DataRow,比如界面中可能先選中DataGrid的某一行,或者某一個Cell,然后點擊一個按鈕,彈出一個新的窗口,窗口中顯示這一行的所有單元的內容,并允許修改單元的值,最后保存關閉窗口。這就需要從當前的DataGrid所在的單元找到其所對應的DataTable所在的行和列。
而DataGrid中顯示的數據可能經過DataView的DataView.RowFilter屬性、DataView.RowStateFilter屬性的過濾,還可能經過DataGrid本身根據各個列的正向和反向排序,所以DataGrid的CurrentRowIndex屬性所指示的行索引跟其對應的DataTable的行索引有很大的機會是不一樣的,不能夠根據DataGrid的CurrentRowIndex去獲取其對應的
分享:ASP.NET程序設計的10大技巧1. 在使用Visual Studio .NET時,除直接或非引用的對象外,不要使用缺省的名字 .NET帶來的好處之一是所有的源代碼和配置文件都是純文本文件,能夠使用Notepad或WordPad等任意的文本編輯器進行編輯。如果不愿意,我們并非一定要使用Visual Studio .NET作為集
- asp.net如何得到GRIDVIEW中某行某列值的方法
- .net SMTP發送Email實例(可帶附件)
- js實現廣告漂浮效果的小例子
- asp.net Repeater 數據綁定的具體實現
- Asp.Net 無刷新文件上傳并顯示進度條的實現方法及思路
- Asp.net獲取客戶端IP常見代碼存在的偽造IP問題探討
- VS2010 水晶報表的使用方法
- ASP.NET中操作SQL數據庫(連接字符串的配置及獲取)
- asp.net頁面傳值測試實例代碼
- DataGridView - DataGridViewCheckBoxCell的使用介紹
- asp.net中javascript的引用(直接引入和間接引入)
- 三層+存儲過程實現分頁示例代碼
- 相關鏈接:
- 教程說明:
.Net教程-注意ADO.NET中容易混淆的概念(5)
。