欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

ADO.NET中容易混淆的概念是什么

本篇文章給大家分享的是有關(guān)ADO.NET中容易混淆的概念是什么,小編覺(jué)得挺實(shí)用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說(shuō),跟著小編一起來(lái)看看吧。

創(chuàng)新互聯(lián)建站專注于思明網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗(yàn)。 熱誠(chéng)為您提供思明營(yíng)銷型網(wǎng)站建設(shè),思明網(wǎng)站制作、思明網(wǎng)頁(yè)設(shè)計(jì)、思明網(wǎng)站官網(wǎng)定制、微信小程序定制開(kāi)發(fā)服務(wù),打造思明網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供思明網(wǎng)站排名全網(wǎng)營(yíng)銷落地服務(wù)。

一、DataTable

DataTable表示內(nèi)存中數(shù)據(jù)的一個(gè)表,它完全是在內(nèi)存中的一個(gè)獨(dú)立存在,包含了這張表的全部信息。DataTable可以是從通過(guò)連接從數(shù)據(jù)庫(kù)中讀取出來(lái)形成的一個(gè)表,一旦將內(nèi)容讀到DataTable中,此DataTable就可以跟數(shù)據(jù)源斷開(kāi)而獨(dú)立存在;也可以是完全由程序自己通過(guò)代碼來(lái)建立的一個(gè)表。

◆ DataColumn

一個(gè)表是由行和列組成的一個(gè)兩維的結(jié)構(gòu)。表的結(jié)構(gòu)是由DataColumn對(duì)象的集合組成,DataColumn對(duì)象集合可由DataTable.Columns屬性中能獲取到,通過(guò)定義每一列的數(shù)據(jù)類型來(lái)確定表的架構(gòu),類似數(shù)據(jù)庫(kù)中定義表。定義完表的結(jié)構(gòu)就可以根據(jù)結(jié)構(gòu)來(lái)生成DataRow,用DataTable.NewRow()方法來(lái)生成此DataTable結(jié)構(gòu)的新行。

一個(gè)DataTable是由DataRow的集合組成的,DataRow的集合這個(gè)可以由DataTable.Rows屬性來(lái)訪問(wèn)。

DataTable還可以通過(guò)現(xiàn)有的列用Expression屬性的表達(dá)式創(chuàng)建一些列。

1、創(chuàng)建計(jì)算出的列

比如:已經(jīng)有了一個(gè)表結(jié)構(gòu),表中有一個(gè)DataColumn的集合,其中有一個(gè)叫UnitPrice的列,你可以新建一個(gè)DataColumn,設(shè)置好ColumnName,再設(shè)置此列的表達(dá)式,DataColumn.Expression="UnitPrice * 0.086",這個(gè)列的值就是名字為UnitPrice的列計(jì)算出來(lái)的,在創(chuàng)建表達(dá)式時(shí),使用ColumnName屬性來(lái)引用列。

2、第二個(gè)用途是創(chuàng)建聚合列

聚合列聚合通常沿著關(guān)系執(zhí)行(有關(guān)關(guān)系的描述見(jiàn)下面DataRelation部分),如果order表有名為detail 的子表,兩個(gè)表之間通過(guò)order.orderid和detail.orderid兩個(gè)列建立一個(gè)關(guān)系DataRelation對(duì)象名為“order2detail”,在主表order中就可以建立一個(gè)聚合列,將計(jì)算每個(gè)order在detail表中含有的所有item的價(jià)格的和:DataColumn.Expression = “sum(child(order2detail).price)",child(order2detail)表示通過(guò)關(guān)系order2detail聯(lián)系到的子表,child(order2detail).price就表示子表的price列。

◆ DataRow

DataRow對(duì)象沒(méi)有直接在代碼中使用的構(gòu)造函數(shù),一般是從具有一定結(jié)構(gòu)的DataTable用NewRow()方法來(lái)新建一個(gè)DataRow對(duì)象。一個(gè)DataRow根據(jù)其是獨(dú)立的,還是屬于某個(gè)DataTable,是否修改過(guò),是否被DataTable刪除等等不同的情況有不同的狀態(tài),由DataRow.RowState屬性公開(kāi),如下表:


成員名稱 說(shuō)明

Added該行已添加到DataRowCollection中,AcceptChanges 尚未調(diào)用。Deleted該行已通過(guò)DataRow的Delete方法被刪除。

Deleted 該行已通過(guò)DataRow的Delete方法被刪除。

Detached 該行已被創(chuàng)建,但不屬于任何DataRowCollection。DataRow 在以下情況下立即處于此狀態(tài):創(chuàng)建之后添加到集合中之前;或從集合中移除之后。

Modified 該行已被修改,AcceptChanges 尚未調(diào)用。

Unchanged 該行自上次調(diào)用 AcceptChanges 以來(lái)尚未更改。

一個(gè)DataRow對(duì)象剛被創(chuàng)建之后其狀態(tài)是Detached,是孤立的一個(gè)存在,所以建立了DataRow之后在DataRow中的單元填充了數(shù)據(jù)后還要通過(guò)DataTable.Rows.Add(DataRow)方法將此DataRow添加到DataTable,DataRow添加到DataTable后, 這個(gè)DataRow的狀態(tài)就轉(zhuǎn)變?yōu)锳dded。當(dāng)修改了這個(gè)DataRow后,這個(gè)DataRow狀態(tài)轉(zhuǎn)為Modified,當(dāng)用DataRow.Delete()方法刪除DataRow后,DataRow狀態(tài)將轉(zhuǎn)為Deleted,不過(guò)此行還存在在DataTable中的,只是狀態(tài)改變了,這時(shí)用DataTable.Rows.Count查看行數(shù),跟刪除前是一樣的。只有在調(diào)用了DataTable.Remove(DataRow)方法后,此DataRow才被從DataTable移除,狀態(tài)也回復(fù)到Detached孤立狀態(tài)。

一旦調(diào)用了DataTable.AcceptChanges()方法后,所有的行將根據(jù)不同的狀態(tài)做不同的處理,Added、Modified、Unchanged將保留當(dāng)前值,Deleted的行將從DataTable中移除,***所有的行的狀態(tài)都置為Unchanged。當(dāng)DataTable是從DataAdapter.Fill(DataSet,DataTable)方法填充而形成的,F(xiàn)ill()方法將自動(dòng)調(diào)用AcceptChanges()方法,將DataTable的行狀態(tài)都置為Unchanged。并且,如果Fill方法中指定的那個(gè)DataTable在要填充的那個(gè)DataSet不存在時(shí),會(huì)生成一個(gè)跟數(shù)據(jù)源表同樣的結(jié)構(gòu)的DataTable并填充數(shù)據(jù)。

◆ DataRelation

表示兩個(gè)DataTable對(duì)象之間的父/子關(guān)系??梢灶惐扔跀?shù)據(jù)庫(kù)中的表之間的關(guān)系,父表相當(dāng)于關(guān)系列為主鍵的表,子表相當(dāng)于關(guān)系列為外鍵的表。DataRelation 構(gòu)造函數(shù)一般為:DataRelation(String, DataColumn, DataColumn) ,string為關(guān)系名,***個(gè)DataColumn為建立關(guān)系的父表列,第二個(gè)DataColumn為建立關(guān)系的子表列,建立關(guān)系的兩個(gè)列的 DataType 值必須相同。

建立好了關(guān)系,必須把這個(gè)關(guān)系加入到DataTable的ParentRelations屬性或ChildRelations 屬性,這兩個(gè)屬性包含這個(gè)表的所有的跟父表的關(guān)系和跟子表的關(guān)系。若關(guān)系中此表是父表則將此關(guān)系加入到ChildRelations集合中,否則加入到ParentRelations集合中。

二、DataView

DataView表示用于排序、篩選、搜索、編輯和導(dǎo)航的 DataTable 的可綁定數(shù)據(jù)的自定義視圖??梢詫ataView同數(shù)據(jù)庫(kù)的視圖類比,不過(guò)有點(diǎn)不同,數(shù)據(jù)庫(kù)的視圖可以跨表建立視圖,DataView則只能對(duì)某一個(gè)DataTable建立視圖。DataView一般通過(guò)DataTable.DefaultView 屬性來(lái)建立,再通過(guò)通過(guò)RowFilter 屬性和RowStateFilter 屬性建立這個(gè)DataTable的一個(gè)子集。

RowFilter屬性用來(lái)篩選要查看DataTable中哪些行的表達(dá)式,這個(gè)表達(dá)式同上面所說(shuō)的建立計(jì)算列的表達(dá)式相同。例如:"LastName = 'Smith'",這就是只查看列LastName的值為'Smith'的那些數(shù)據(jù)行。

RowStateFilter 屬性用來(lái)設(shè)置DataView中的行狀態(tài)篩選器,上面介紹DataRow時(shí)介紹了DataRow的狀態(tài),一個(gè)DataRow可能有五種狀態(tài),RowStateFilter就是可以通過(guò)這些狀態(tài)來(lái)篩選要查看的行集。其實(shí)DataRow不僅有五種狀態(tài),DataRow還有版本的問(wèn)題,比如當(dāng)DataRow的狀態(tài)為Modified,即這行已經(jīng)被修改了,這時(shí)這個(gè)DataRow就會(huì)有兩個(gè)版本,Current版本和Original版本(修改前的)。實(shí)際上RowStateFilter屬性是綜合了DataRow的狀態(tài)和版本來(lái)篩選的(RowStateFilter確省值是CurrentRows)見(jiàn)下表:

成員名稱/說(shuō)明

Added:一個(gè)新行。

CurrentRows:包括未更改行、新行和已修改行的當(dāng)前行。

Deleted:已刪除的行。

ModifiedCurrent:當(dāng)前版本,原始數(shù)據(jù)(請(qǐng)參閱ModifiedOriginal)的修改版本。

ModifiedOriginal:原始版本(盡管它后來(lái)已被修改并以ModifiedCurrent 形式存在)。

None:無(wú)。

OriginalRows:包括未更改行和已刪除行的原始行。

Unchanged:未更改的行。

DataView.Count屬性得到的計(jì)數(shù)是在應(yīng)用了 RowFilter 和 RowStateFilter 之后,獲取 DataView 中記錄的數(shù)量。

DataView是建立在DataTable基礎(chǔ)上的,DataView.Table 屬性可以得到此DataView對(duì)應(yīng)的那個(gè)DataTable。DataView的行叫DataRowView,可以從DataRowView直接通過(guò)DataRowView.Row 屬性得到此DataRowView對(duì)應(yīng)的DataRow。

三、DataGrid

這里說(shuō)的DataGrid是winform中的DataGrid,一般都是跟DataView綁定來(lái)顯示DataTable中的數(shù)據(jù),和修改DataTable中的數(shù)據(jù)。

DotNet的DataGrid的功能強(qiáng)大,可是在使用上與以前的習(xí)慣不太一樣,有時(shí)還比較麻煩,所以很多人都對(duì)這個(gè)DataGrid感到有些摸不著頭腦,有一種無(wú)從下手的感覺(jué),其實(shí)把一些概念搞清楚了許多問(wèn)題就會(huì)迎刃而解了。

DataGrid通過(guò)DataSource和DataMember 屬性來(lái)綁定其要顯示的數(shù)據(jù)源。數(shù)據(jù)源一般是DataTable、DataView、DataSet等,不過(guò)將這些數(shù)據(jù)源綁定到DataGrid時(shí)實(shí)際上是綁定的DataView。若數(shù)據(jù)源是DataTable時(shí),實(shí)際上是綁定了此DataTable的DefaultView,若數(shù)據(jù)源是DataSet時(shí),則可以向DataMember屬性設(shè)置一個(gè)字符串,該字符串指定要綁定到的表,然后再將DataMember指定的那個(gè)DataTable的DefaultView綁定到DataGrid。

所以DataGrid實(shí)際顯示的是DataTable經(jīng)過(guò)篩選的DataView。

◆ DataGrid以何種方式顯示DataView的數(shù)據(jù)

DataGrid綁定到一個(gè)DataView后,由DataGrid.TableStyles中的DataGridTableStyle 對(duì)象的集合來(lái)控制這個(gè)DataView的哪些列要顯示,列的寬度多少,列標(biāo)頭的文本是什么等等。確省的DataGrid.TableStyles中不包含任何對(duì)象,這時(shí)DataGrid將會(huì)按照DataView列的順序?qū)⑺械牧卸硷@示出來(lái)。一般應(yīng)用中都會(huì)設(shè)置TableStyles來(lái)控制顯示的內(nèi)容及格式。

例如DataGrid綁定到一張叫order的DataTable,這個(gè)DataTable包含了OrderID、CustomerID、OrderDate、ShipName、ShipAddress等字段,可以看到DataGrid將會(huì)按照DataView列的順序?qū)⑺械牧卸硷@示出來(lái)

我們只想顯示OrderID、CustomerID、OrderDate這三個(gè)字段,并且想將OrderID的列表頭顯示為“訂單號(hào)”,CustomerID顯示為“客戶號(hào)”,OrderDate顯示為“訂單日期”,這就要用TableStyles來(lái)控制了。

新建一個(gè)TableStyle,將此TableStyle.MappingName屬性對(duì)應(yīng)到這個(gè)TableStyle要控制的那個(gè)DataTable的名字:

DataGridTableStyle myTableStyle = new DataGridTableStyle();

myTableStyle.MappingName = "myDateTable";

再建立三個(gè)DataGridColumnStyle,分別用來(lái)控制將要顯示的三個(gè)列:

DataGridColumnStyle myColumnStyle1 = new DataGridTextBoxColumn(); 
myColumnStyle1.MappingName = "OrderID"; 
myColumnStyle1.HeaderText = "訂單號(hào)"; 

DataGridColumnStyle myColumnStyle2 = new DataGridTextBoxColumn(); 
myColumnStyle2.MappingName = "CustomerID"; 
myColumnStyle2.HeaderText = "客戶號(hào)"; 

DataGridColumnStyle myColumnStyle3 = new DataGridTextBoxColumn(); 
myColumnStyle3.MappingName = "OrderDate"; 
myColumnStyle3.HeaderText = "訂單日期"; 

將這三個(gè)DataGridColumnStyle添加到TableStyle中: 

myTableStyle.GridColumnStyles.Add(myColumnStyle1); 
myTableStyle.GridColumnStyles.Add(myColumnStyle2); 
myTableStyle.GridColumnStyles.Add(myColumnStyle3);

***將TableStyle添加到DataGrid中:

dataGrid1.TableStyles.Add(myTableStyle);

將TableStyle添加到DataGrid后,再綁定數(shù)據(jù)源。

◆ DataGrid的編輯修改

DataGrid支持對(duì)DataGrid所顯示的DataTable的編輯修改,只要DataGrid的ReadOnly屬性為False,就可以在DataGrid中直接修改單元中的內(nèi)容,修改完后數(shù)據(jù)將直接反應(yīng)到此DataGrid對(duì)應(yīng)的那個(gè)DataTable的單元。

如果這個(gè)DataTable是通過(guò)vs.net的可視化數(shù)據(jù)設(shè)計(jì)器新建DataAdapter,并生成了SelectCommand、InsertCommand、UpdateCommand、DeleteCommand這四個(gè)命令,用DataAdapter的Fill方法得來(lái)的,那么事情就簡(jiǎn)單了,修改過(guò)的DataTable你可以直接用DataAdapter的UpDate方法寫回到數(shù)據(jù)庫(kù)。下面看一下vs.net的可視數(shù)據(jù)數(shù)據(jù)器生成的InsertCommand命令:

this.sqlInsertCommand1.CommandText = @"INSERT INTO Customers
(CustomerID, CompanyName, ContactName, ContactTitle, Address, 
City, Region, PostalCode, Country, Phone, Fax)
VALUES (@CustomerID, @CompanyName, @ContactName, @ContactTitle,
@Address, @City, @Region, @PostalCode, @Country, @Phone, @Fax);
SELECT CustomerID, CompanyName, ContactName, ContactTitle, Address, 
City, Region, PostalCode, Country, Phone,
Fax FROM Customers WHERE (CustomerID = @CustomerID)";
this.sqlInsertCommand1.Connection = this.sqlConnection2; 
this.sqlInsertCommand1.Parameters.Add
(new System.Data.SqlClient.SqlParameter
("@CustomerID", System.Data.SqlDbType.NVarChar, 5, "CustomerID"));
this.sqlInsertCommand1.Parameters.Add
(new System.Data.SqlClient.SqlParameter
("@CompanyName", System.Data.SqlDbType.NVarChar, 40, "CompanyName")); 
this.sqlInsertCommand1.Parameters.Add
(new System.Data.SqlClient.SqlParameter
("@ContactName", System.Data.SqlDbType.NVarChar, 30, "ContactName")); 
this.sqlInsertCommand1.Parameters.Add
(new System.Data.SqlClient.SqlParameter
("@ContactTitle", System.Data.SqlDbType.NVarChar, 30, "ContactTitle")); 
this.sqlInsertCommand1.Parameters.Add
(new System.Data.SqlClient.SqlParameter
("@Address", System.Data.SqlDbType.NVarChar, 60, "Address")); 
this.sqlInsertCommand1.Parameters.Add
(new System.Data.SqlClient.SqlParameter
("@City", System.Data.SqlDbType.NVarChar, 15, "City")); 
this.sqlInsertCommand1.Parameters.Add
(new System.Data.SqlClient.SqlParameter
("@Region", System.Data.SqlDbType.NVarChar, 15, "Region")); 
this.sqlInsertCommand1.Parameters.Add
(new System.Data.SqlClient.SqlParameter
("@PostalCode", System.Data.SqlDbType.NVarChar, 10, "PostalCode")); 
this.sqlInsertCommand1.Parameters.Add
(new System.Data.SqlClient.SqlParameter
("@Country", System.Data.SqlDbType.NVarChar, 15, "Country")); 
this.sqlInsertCommand1.Parameters.Add
(new System.Data.SqlClient.SqlParameter
("@Phone", System.Data.SqlDbType.NVarChar, 24, "Phone")); 
this.sqlInsertCommand1.Parameters.Add
(new System.Data.SqlClient.SqlParameter
("@Fax", System.Data.SqlDbType.NVarChar, 24, "Fax"));

DataAdapter的SelectCommand是用來(lái)DataAdapter.Fill()方法來(lái)填充DataTable的,SelectCommand選擇的數(shù)據(jù)表行集將被填充到DataTable中,然后DataGrid將它顯示出來(lái)。

DataGrid在經(jīng)過(guò)編輯修改后,其對(duì)應(yīng)的DataTable中的行就可能出現(xiàn)文章上面所述的那五種狀態(tài),可能是新加的(Added),可能是修改了的(Modified),可能是刪除的(Deleted),DataAdapter.UpDate()方法將通過(guò)調(diào)用InsertCommand命令將狀態(tài)為Added的行插入到數(shù)據(jù)庫(kù),UpdateCommand將狀態(tài)為Modified的行在數(shù)據(jù)庫(kù)中做修改,DeleteCommand將狀態(tài)為Deleted的行在數(shù)據(jù)庫(kù)真正的刪除。

如果不是通過(guò)vs.net的可視化數(shù)據(jù)設(shè)計(jì)器新建DataAdapter,沒(méi)有自動(dòng)生成SelectCommand、InsertCommand、UpdateCommand、DeleteCommand這四個(gè)命令,那么就可能需要自己寫InsertCommand、UpdateCommand、DeleteCommand命令,有一種情況就是當(dāng)SelectCommand至少返回一個(gè)主鍵列或唯一的列時(shí),可以通過(guò)SqlCommandBuilder來(lái)自動(dòng)根據(jù)SelectCommand命令來(lái)自動(dòng)生成另外三個(gè)更新命令,例如:

SqlConnection myConn = new SqlConnection(myConnection); 
SqlDataAdapter myDataAdapter = new SqlDataAdapter(); 
myDataAdapter.SelectCommand = new SqlCommand(mySelectQuery, myConn);
//建立DataAdapter的SelectCommand命令 
SqlCommandBuilder custCB = new SqlCommandBuilder(myDataAdapter);
//建立此DataAdapter的CommandBuilder, 
//這樣系統(tǒng)就會(huì)給此DataAdapter自動(dòng)生成
InsertCommand、UpdateCommand、DeleteCommand三個(gè)命令。

否則,要用DataAdapter.UpDate()方法更新數(shù)據(jù)庫(kù)就要自己寫InsertCommand、UpdateCommand、DeleteCommand這三個(gè)命令,可以參考上面給出的vs.net自動(dòng)生成的InsertCommand命令的寫法。

◆ 數(shù)據(jù)綁定的同步

WinForm中很多控件都可以與數(shù)據(jù)源綁定,綁定又分兩種情況:

簡(jiǎn)單數(shù)據(jù)綁定

簡(jiǎn)單數(shù)據(jù)綁定指將一個(gè)控件綁定到單個(gè)數(shù)據(jù)元素(如數(shù)據(jù)集表的列中的值)的能力。這是用于控件,如 TextBox 控件或 Label 控件(即通常只顯示單個(gè)值的控件)的典型綁定類型。事實(shí)上,控件上的任何屬性都可以綁定到數(shù)據(jù)庫(kù)中的字段。

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

復(fù)雜數(shù)據(jù)綁定指將一個(gè)控件綁定到多個(gè)數(shù)據(jù)元素的能力,通常綁定到數(shù)據(jù)庫(kù)中的多條記錄,或者綁定到多個(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è)定此屬性來(lái)指定要綁定到的表。

經(jīng)常有這種需求,一個(gè)窗體中有一個(gè)DataGrid,顯示了一些數(shù)據(jù),窗體上還有一些TextBox控件,用來(lái)顯示DataGrid中的當(dāng)前行的數(shù)據(jù),一個(gè)TextBox控件對(duì)應(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ī)制來(lái)保證這些控件的同步,DotNet中負(fù)責(zé)數(shù)據(jù)同步的是BindingManagerBase,它是用來(lái)管理數(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í)傳遞的對(duì)象一樣的,都將屬于這個(gè)BindingManagerBase管理,比如,建立一個(gè)如下的BindingManagerBase:

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

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

同樣簡(jiǎn)單數(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ù),不過(guò)在DataGrid的行標(biāo)頭里有個(gè)黑色的三角箭頭用來(lái)指示當(dāng)前行。簡(jiǎn)單綁定控件中顯示的值將是數(shù)據(jù)源當(dāng)前行的內(nèi)容。

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

myBindingManagerBaseParent.Position = 10;

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

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

對(duì)應(yīng)Customer的BindingManagerBase上面我們已經(jīng)建立好了,下面我們來(lái)建立對(duì)應(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ò)關(guān)系,建立對(duì)應(yīng)order表的BindingManagerBase:

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

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

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

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

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

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

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

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

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

這時(shí)BindingManagerBase又將發(fā)揮作用了,我們可以先建立一個(gè)對(duì)應(yīng)此DataGrid綁定的數(shù)據(jù)源的BindingManagerBase,這樣這個(gè)BindingManagerBase就可以管理這個(gè)數(shù)據(jù)源。

//設(shè)置DataGrid的數(shù)據(jù)源 
dataGrid1.DataSource = myDataSet; 
dataGrid1.DataMember = "customers"; 
//建立同DataGrid同樣數(shù)據(jù)源的BindingManagerBase 
BindingManagerBase myBindingManagerBaseParent = 
this.BindingContext[myDataSet,"customers"];

一旦建立了這個(gè)BindingManagerBase,就可以通過(guò)BindingManagerBase的當(dāng)前行的屬性來(lái)獲取當(dāng)前數(shù)據(jù)源的記錄:

//BindingManagerBase的Current返回?cái)?shù)據(jù)源的對(duì)象,對(duì)于綁定到DataView的數(shù)據(jù)源,需要將此對(duì)象顯式

//的轉(zhuǎn)換為 DataRowView類型

DataRowView myDataRowView =(DataRowView) myBindingManagerBaseParent.Current

這樣,我們就可以從當(dāng)前的Cell得到此Cell所在的DataRowView,DataRowView又可以通過(guò)DataRowView.Row屬性及其方便的得到DataRow。

如果還要進(jìn)一步,想要得到此Cell所對(duì)應(yīng)的DataTable的具體單元,就是不光要得到DataRow,還要知道這個(gè)Cell所對(duì)應(yīng)的列。

這又分兩種情況:

一是DataGrid未使用TableStyles來(lái)設(shè)置DataGrid要顯示的列和格式,數(shù)據(jù)源DataView的所有列都將按照DataView本身的順序顯示出來(lái),這樣可以直接取得對(duì)應(yīng)的列索引:

//獲取當(dāng)前DataGrid單元的列索引,這個(gè)索引跟DataTable的索引是一樣的
Int ColumnNumber = DataGrid.CurrentCell.ColumnNumber;

另一種情況是DataGrid使用了TableStyles來(lái)設(shè)置DataGrid要顯示的列和格式,這樣DataGrid單元的列索引跟DataTable的索引就可能是不一樣的了,這就要用DataGrid的TableStyles了:

Int ColumnNumberDataGrid = DataGrid.CurrentCell.ColumnNumber; 
//獲取當(dāng)前DataGrid單元的列索引 
Int ColumnNumberDataTable = 
DataGrid.TableStyles[0].GridColumnStyles[ColumnNumberDataGrid].MappingName

以上就是ADO.NET中容易混淆的概念是什么,小編相信有部分知識(shí)點(diǎn)可能是我們?nèi)粘9ぷ鲿?huì)見(jiàn)到或用到的。希望你能通過(guò)這篇文章學(xué)到更多知識(shí)。更多詳情敬請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。

本文標(biāo)題:ADO.NET中容易混淆的概念是什么
網(wǎng)頁(yè)URL:http://aaarwkj.com/article26/gdiccg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供關(guān)鍵詞優(yōu)化、品牌網(wǎng)站制作、用戶體驗(yàn)、網(wǎng)站維護(hù)、品牌網(wǎng)站設(shè)計(jì)微信公眾號(hào)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都定制網(wǎng)站網(wǎng)頁(yè)設(shè)計(jì)
青青草视频免费观看高清在线观看新| 日本加勒比高清在线播放| 亚洲精品欧美日韩久久| 91欧美一区二区在线视频| 丰满少妇亚洲中文字幕| 91免费福利激情视频| 日韩人妻高清精品专区 | 亚洲国产日韩精品一区二| 欧美日韩精品乱码在线观看| 黄片色呦呦视频免费看| 欧美日韩在线不卡一区| 亚洲人妻不卡一区二区| 久久精品国产视频在热| 欧美视频综合一级91| 亚洲国产专区一区二区麻豆| 国产真人免费作爱视频网站| 天天躁人人躁夜夜躁狠狠躁| 久久夜色一区二区三区| 午夜福利日本一区二区| 亚洲一区二区三区av蜜桃| 亚洲av永久精品一区二区三区| 久久精品国产亚洲av高清观看| 国产三级视频在线观看视频 | 国产三级自拍视频在线观看| 后入蜜桃臀美女在线观看| 太爽了少妇高潮在线看片| 天堂av一区二区三区| 亚洲精品入口一区二区| 日韩欧美一区二区中文字幕视频| 我想看亚洲一级黄色录像| 日本姜女黄视频免费看| 本色啪啪人妻夜嗨嗨av| 亚洲毛片在线免费播放| 伊人久久精品一区二区| 久久久久久这里都是精品| 久久精品国产一区电影| 国产一区av麻豆免费观看| 中文字幕日韩精品国产| 风韵犹存丰满大屁股熟妇| 日本韩国欧美成人精品| 极品大胸美女被啪啪的高潮 |