關(guān)于C1NET中的數(shù)據(jù)庫控件的使用_第1頁
關(guān)于C1NET中的數(shù)據(jù)庫控件的使用_第2頁
關(guān)于C1NET中的數(shù)據(jù)庫控件的使用_第3頁
關(guān)于C1NET中的數(shù)據(jù)庫控件的使用_第4頁
關(guān)于C1NET中的數(shù)據(jù)庫控件的使用_第5頁
已閱讀5頁,還剩21頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、3.2 綁定到數(shù)據(jù)源創(chuàng)建數(shù)據(jù)源后,就可以使用數(shù)據(jù)綁定技術(shù)將窗體控件同數(shù)據(jù)源關(guān)聯(lián)起來。這可能很簡單,也可能很復(fù)雜,就看要怎么實(shí)現(xiàn),可能同時要用到聲明式方法(通常是使用向?qū)В┖途幊淌椒椒ǎㄊ褂米约旱拇a定制行為)。本章將采用較簡單的方法,只使用向?qū)?shù)據(jù)綁定到控件。本書后面將介紹更高級的定制??梢詫?shù)據(jù)綁定到很多控件,但使用向?qū)е荒芙壎ǖ较铝锌丶?列表控件:在列表中顯示單列數(shù)據(jù); DataGridView控件:以類似于表格的格式顯示數(shù)據(jù); BindingNavigator控件:在表中的多條記錄之間導(dǎo)航; 由基本控件(如TextBox和Label)組成的詳細(xì)視圖:顯示單行數(shù)據(jù)。稍后將介紹如何完成這

2、些工作,但在此之前先來看一下另一個控件:BindingSource,它是數(shù)據(jù)綁定的核心。 BindingSource控件BindingSource控件充當(dāng)數(shù)據(jù)綁定控件和數(shù)據(jù)源之間的中介。它提供了一個通用接口,其中包含控件綁定到數(shù)據(jù)源時所需的所有功能。使用向?qū)⒖丶壎ǖ綌?shù)據(jù)源時,實(shí)際上創(chuàng)建并配置了一個BindingSource控件實(shí)例,并綁定到該實(shí)例。這種架構(gòu)提供了很大的靈活性,尤其是在復(fù)雜的情形下,因?yàn)檫@樣可以將數(shù)據(jù)源設(shè)計(jì)為任何形式,只要它能夠與BindingSource控件進(jìn)行通信。這意味著可以使用非數(shù)據(jù)庫數(shù)據(jù)源,或使用極其復(fù)雜的數(shù)據(jù)訪問機(jī)制的自定義數(shù)據(jù)源。然而,在本書的大部分地方,都將使

3、用BindingSource控件來訪問類型化數(shù)據(jù)集類。前面提到過,配置BindingSource控件通常都是自動完成的。然而,為避免后臺發(fā)生太多看不到的操作,需要對這個控件的工作原理進(jìn)行較深入研究,看看如何手工配置它??梢允止さ貙⒃摽丶膶?shí)例添加到窗體中。它是不可見的組件,在窗體中看不到。添加的實(shí)例將出現(xiàn)在窗體下面,如圖3.17所示。在圖3.17所示中,添加的BindingSource實(shí)例使用默認(rèn)名bindingSource1。當(dāng)然,可以修改它的名稱,但在這里的討論中,將使用該名稱。如果創(chuàng)建了一個新的Windows窗體程序,并在主窗口Form1中添加了一個Binding Source控件,則完

4、成本節(jié)后將產(chǎn)生一些代碼。配置BindingSource實(shí)例的第一步是設(shè)置其DataSource屬性。這可以是幾種數(shù)據(jù)源中的任何一種,包括自己創(chuàng)建的數(shù)據(jù)源,但通常是類型化數(shù)據(jù)集。使用屬性窗口,可以綁定到項(xiàng)目中類型化數(shù)據(jù)集,如圖3.18所示。如果讀者在自己的項(xiàng)目中進(jìn)行操作,則需要添加數(shù)據(jù)源到項(xiàng)目中,才能看到與圖3.18相同的顯示(添加數(shù)據(jù)源后,選擇bindingSource1控件;然后,在屬性窗口中選擇DataSource屬性,并單擊下拉箭頭。在下拉列表中,選擇要使用的數(shù)據(jù)源。對于使用類型化數(shù)據(jù)集的數(shù)據(jù)源,應(yīng)展開“其他數(shù)據(jù)源”,然后展開“項(xiàng)目數(shù)據(jù)源”,才能找到數(shù)據(jù)源)。 圖3.17 窗體中的Bin

5、dingSource控件 圖3.18 為BindingSource組件選擇數(shù)據(jù)源圖3.18選擇了類型化數(shù)據(jù)集FolktaleDBDataSet作為數(shù)據(jù)源。以這種方式選擇類型化數(shù)據(jù)集類時,將生成該類的一個實(shí)例。在這個示例中,選擇了類型化數(shù)據(jù)集FolktaleDBDataSet,導(dǎo)致在窗體中添加了成員字段folktaleDBDataSet。它在Form1.Designer.cs中定義如下:private FolktaleDBDataSet folktaleDBDataSet;正是這個成員被用作BindingSource控件的數(shù)據(jù)源。選擇數(shù)據(jù)源后,設(shè)置BindingSource控件的DataMemb

6、er屬性,更詳細(xì)地指定要綁定到數(shù)據(jù)源中的哪些數(shù)據(jù)。綁定到類型化數(shù)據(jù)集時,將該屬性設(shè)置為數(shù)據(jù)表,該表可用本章前面介紹的任何方法填充。在屬性窗口中,可用從數(shù)據(jù)集中的多個表中選擇,如圖3.19所示。圖3.19以這種方式添加DataMember時,將在代碼中添加另一個新成員一個數(shù)據(jù)適配器:private .FolktaleDBDataSetTableAdapters.StoryTableAdapter storyTableAdapter;另外,在Form.cs中的Load事件處理程序中,添加了使用這個數(shù)據(jù)適配器填充數(shù)據(jù)集實(shí)例中相關(guān)表的代碼:private void Form1_Load(object

7、sender, EventArgs e) / TODO: This line of code loads data into the folktaleDBDataSet.Story table. / You can move, or remove it, as needed. this.storyTableAdapter.Fill(this.folktaleDBDataSet.Story);自動生成的注釋指出,這只是為方便而添加的,可以將它移到任何位置。上述代碼表明,窗體加載時將加載數(shù)據(jù),使其立即可用,這通常是程序員希望的。數(shù)據(jù)適配器和類型化數(shù)據(jù)集實(shí)例都顯示在窗體設(shè)計(jì)器的組件部分,在Bindi

8、ngSource控件的旁邊??梢栽谶@里通過屬性配置控件,包括指定是否在代碼中生成成員等。表3.2描述了BindingSource控件中其他幾個可能要修改的屬性,它們都是可選的。表3.2 程序員可能要修改的BindingSource控件屬性屬性描述AllowNewBindingSource控件是否允許數(shù)據(jù)綁定控件添加新項(xiàng)Filter一個過濾器表達(dá)式,指定數(shù)據(jù)綁定控件可使用哪些項(xiàng)。它并不影響存儲在底層數(shù)據(jù)源中的數(shù)據(jù),這不同于本章前面介紹過的過濾器查詢Sort一系列用逗號分隔的要根據(jù)它們進(jìn)行排序的列,使用SQL格式,使得必要時可包含關(guān)鍵字ASC或DESCName控件的名稱GenerateMember

9、是否在窗體類定義中生成字段來引用BindingSourcModifiers如果添加了字段,該字段使用什么訪問修飾符配置好BindingSource控件后,可用于將數(shù)據(jù)綁定到其他控件。也可以在配置其他控件時配置BindingSource控件;前面提到過,向?qū)Э梢酝瓿蛇@項(xiàng)任務(wù)。 綁定到列表控件有兩種Windows窗體控件支持?jǐn)?shù)據(jù)綁定:ListBox和ComboBox。第2章使用了ListBox來執(zhí)行簡單綁定。這兩個控件都可以使用數(shù)據(jù)源中的兩列來創(chuàng)建列表,一列用于顯示文本項(xiàng),另一列用于顯示文本項(xiàng)的值。也可以將同一列用于這兩種用途。ListView控件更復(fù)雜讀者可能會問,為什么ListView控件不支

10、持?jǐn)?shù)據(jù)綁定?畢竟它也是一個顯示列表的控件。ListView控件是一種更復(fù)雜的列表創(chuàng)建方法,它可以顯示更復(fù)雜的內(nèi)容,而不僅僅是字符表;它有很多選項(xiàng)。因此,不能使用向?qū)?shù)據(jù)綁定到ListView控件。這并不是說不能使用這種控件來顯示數(shù)據(jù)庫中的數(shù)據(jù),只是必須使用其他方法:編寫自定義代碼來管理ListView控件的數(shù)據(jù)綁定。很多人編寫繼承這個類的控件,并添加自定義的數(shù)據(jù)綁定邏輯來實(shí)現(xiàn)所需的行為。在ListBox控件和ComboBox控件中,有3個與數(shù)據(jù)綁定相關(guān)的重要屬性。 DataSource:指向數(shù)據(jù)源的對象引用; DisplayMember:一個列的字符串名,將從該列提取字符串以顯示在列表中;

11、ValueMember:一個列的字符串名,將從該列提取列表項(xiàng)的值數(shù)據(jù)。對于這兩個控件,可在屬性窗口中或窗體的隱藏代碼中手工設(shè)置其屬性;也可以使用控件的任務(wù)窗口來設(shè)置。第2章使用了后一種方法,將數(shù)據(jù)綁定到一個ListBox控件。圖3.20顯示了ListBox任務(wù)窗口,其中的“使用數(shù)據(jù)綁定項(xiàng)”選項(xiàng)被選中。圖3.20 使用任務(wù)窗口將數(shù)據(jù)綁定到ListBox注意,這里有第4個選項(xiàng)“選定值”。使用它可以將當(dāng)前選定的值綁定到數(shù)據(jù)。這通常用于列表需要根據(jù)窗體其他地方顯示的數(shù)據(jù)進(jìn)行更新,并能夠綁定到可能由其他數(shù)據(jù)控件使用的其他數(shù)據(jù)集實(shí)例的情形。就當(dāng)前而言,讀者最好將注意力放在其他3個屬性上。要將數(shù)據(jù)綁定到Li

12、stBox或ComboBox,首先要選擇數(shù)據(jù)源。如果已經(jīng)創(chuàng)建了BindingSource控件,只需選擇該控件暴露的表。也可以選擇類型化數(shù)據(jù)集中的表,這將自動檢測所有需要的對象:數(shù)據(jù)集實(shí)例、BindingSource實(shí)例和表適配器實(shí)例。與添加BindingSource控件一樣,也將自動在窗體的Load事件處理程序中添加一些代碼,用于填充類型化數(shù)據(jù)集。數(shù)據(jù)加載后,ListBox或ComboBox將自動綁定到數(shù)據(jù)。然而,除非設(shè)置了顯示和值成員,否則將看不到什么有趣的東西;看到的結(jié)果將是一個列表,它是將數(shù)據(jù)綁定到列表時調(diào)用ToString()的默認(rèn)實(shí)現(xiàn)獲得的:綁定到類型化數(shù)據(jù)集的數(shù)據(jù)時,將是Syste

13、m.Data.DataRowView對象組成的一個列表。這將使ListBox包含多項(xiàng)(每項(xiàng)對應(yīng)綁定的數(shù)據(jù)中的一行),這些項(xiàng)都讀取System.Data.DataRowView。每項(xiàng)都正確地表示底層數(shù)據(jù)表中的一行,然而,如果根據(jù)行顯示數(shù)據(jù)將更友好,這樣就可以區(qū)分出哪些數(shù)據(jù)來自哪行。 綁定到DataGridView控件將數(shù)據(jù)綁定到DataGridView控件時,不需要什么工作就可獲得很多功能。這些功能包括允許用戶編輯數(shù)據(jù)、對數(shù)據(jù)進(jìn)行排序、調(diào)整列的大小和順序等。只要設(shè)置相關(guān)的屬性就可以實(shí)現(xiàn)這些功能。與前一節(jié)介紹的列表控件一樣,可以使用屬性來配置DataGridView的數(shù)據(jù)綁定,屬性可用多種方法來設(shè)

14、置,包括使用“DataGridView任務(wù)”窗口,如圖3.21所示。圖3.21 “DataGridView任務(wù)”窗口使用下拉列表“選擇數(shù)據(jù)源”來綁定到表數(shù)據(jù)源時,將創(chuàng)建一個數(shù)據(jù)集實(shí)例、一個BindingSource實(shí)例和一個表適配器實(shí)例。然而,這里配置了數(shù)據(jù)綁定控件的更多方面。例如,不必選擇用作列表項(xiàng)的顯示文本和值的列,而將顯示表中定義的所有列(如果不需要這么多列,以后可以修改)。只要選擇數(shù)據(jù)源,就可以獲得用戶可與之交互的界面。如果使用圖3.21所示的默認(rèn)選項(xiàng),還可以讓用戶能夠編輯數(shù)據(jù)集的內(nèi)容(然而,如果不對應(yīng)用程序做進(jìn)一步修改,用作所做的編輯將不會提交給數(shù)據(jù)庫)。DataGridView控件

15、最重要的功能之一是修改顯示的列,包括列的類型。單擊“DataGridView任務(wù)”窗口中的“編輯列”鏈接,可以訪問DataGridView中的列集合,這將打開“編輯列”窗口,如圖3.22所示。圖3.22 DataGridView的列編輯器“編輯列”窗口分為兩個主要部分。左邊是當(dāng)前被顯示的所有列,每列都顯示了其類型和名稱。在圖3.22所示中,左邊列出了6個文本列,其中StoryId列被選中(從左邊列表中的圖標(biāo)及右邊加亮顯示的ColumnType屬性都可以看出來)。右邊是與選定列相關(guān)的屬性。選定列的類型不同,顯示的屬性也不同,但其中有很多屬性適用于所有類型的列。不是每列都必須綁定到數(shù)據(jù)源中的列,同

16、樣,也不是數(shù)據(jù)源的每列都必須綁定到DataGridView中的列。列的類型有下列幾種。 DataGridViewTextBoxColumn:文本框,主要用于顯示簡單文本屬性的,也可用于其他類型(尤其是數(shù)值類型)。 DataGridViewCheckBoxColumn:復(fù)選框,主要用于類型為布爾值(bit)的列值。 DataGridViewComboBoxColumn:下拉列表框,允許從一系列列表項(xiàng)中選擇。可以將可用項(xiàng)列表綁定到另一個數(shù)據(jù)源,這使它非常適用于一對多關(guān)系的“多”端。 DataGridViewButtonColumn:按鈕,它并不常用于綁定數(shù)據(jù),但它可用于布爾數(shù)據(jù)或調(diào)用包含較長文本數(shù)

17、據(jù)的對話框。較常見的一種用法是,對行執(zhí)行某種操作,如確認(rèn)對數(shù)據(jù)庫的修改。 DataGridViewLinkColumn:與DataGridViewButtonColumn類似,但顯示為LinkButton。常用于查看長文本字段的值,也可以用于在瀏覽器窗口中打開URL等。 DataGridViewImageColumn:圖像顯示,在數(shù)據(jù)庫包含二進(jìn)制格式的圖像數(shù)據(jù)時使用。在稍后的練習(xí)中,將查看文本數(shù)據(jù)以及將其他數(shù)據(jù)綁定到組合框?,F(xiàn)在先看一下下表,它描述了編輯DataGridView中的列時可使用的一些屬性,尤其是適用于所有列類型的屬性。表3.3 編輯DataGridView中的列時可使用的一些屬性

18、屬性描述DefaultCellStyle與樣式相關(guān)的屬性集合,可用于控制列中單元格的外觀。例如,可以設(shè)置單元格的前景顏色和背景顏色HeaderText顯示在列標(biāo)題中的文本。這些文本不一定要與數(shù)據(jù)庫中的列名相同;通常使用對用戶更友好的文本ContextMenuStrip如果使用了上下文菜單,該屬性可用于將列同菜單相關(guān)聯(lián)ReadOnly列是否可編輯Resizable用戶是否可以調(diào)整列的大小SortModeAutomatic(根據(jù)底層列名和類型排序)、Programmatic(編寫代碼來根據(jù)該列排序)或NotSortable(用戶不能根據(jù)該列進(jìn)行排序)AutoSizeMode列如何自動調(diào)整大小。有幾

19、種選擇,可以根據(jù)列的值、列標(biāo)題文本、可見單元格的值等自動調(diào)整大小Frozen用戶滾動屏幕時,是否移動列。將該屬性設(shè)置為true,可以鎖定重要的列,如ID值,使這些列總是可見,而不管用戶如何滾動下面的練習(xí)將顯示大型文本字段。1顯示長文本當(dāng)列中包含大量文本時(例如,在SQL Server中,使用可以包含較多字符的text數(shù)據(jù)類型或varchar時),在DataGridView的單個文本框中顯示這些文本通常并不是很有用。一種流行的做法是提供一個鏈接,當(dāng)用戶單擊該鏈接時,在彈出的對話框中顯示這些文本。下面是實(shí)現(xiàn)這種功能的步驟。(1)使用前一個練習(xí)介紹的步驟,將項(xiàng)目C:BegVC#DatabasesCh

20、apter03Ex0302 Manual Configuration復(fù)制為新的項(xiàng)目C:BegVC#DatabasesChapter03Ex0303 Large Text。(2)在設(shè)計(jì)視圖中打開Form1。(3)添加一個DataGridView控件到Form1中。(4)在“DataGridView任務(wù)”窗口中,選擇“在父容器中停靠”。(5)在“DataGridView任務(wù)”窗口中,從下拉列表“數(shù)據(jù)源”中,選擇“其他數(shù)據(jù)源”“項(xiàng)目數(shù)據(jù)源”“FolktaleDBDataSet2”,然后單擊“Story”。(6)調(diào)整Form1的大小,使得不用水平滾動滾動條就能顯示窗體中的所有列。(7)在“DataGr

21、idView任務(wù)”窗口中,禁用添加、編輯和刪除,然后單擊“編輯列”。(8)修改Summary列的類型,將ColumnType屬性改為DataGridViewLinkButton。(9)將Summary列的Text屬性設(shè)置為Show,并將UseColumnTypeForLinkValue設(shè)置為true。單擊“確定”關(guān)閉“編輯列”對話框。(10)在DataGridView控件上雙擊,為DataGridView.CellConnectClick添加一個事件處理程序。(11)按如下修改該事件處理程序的代碼:private void dataGridView1_CellContentClick(obje

22、ct sender, DataGridViewCellEventArgs e)if (dataGridView1.CurrentCell.OwningColumn.DataPropertyName =Summary) string summaryText = (dataGridView1.CurrentRow.DataBoundItem as DataRowView).Row as FolkDBDataSet2.StoryRow).Summary; MessageBox.Show(summaryText, Story Summary, MessageBoxButtons.OK);(12)運(yùn)行程

23、序,然后單擊某行的“Show”,結(jié)果應(yīng)如圖3.23所示。(13)關(guān)閉程序和Visual C#速成版。2解釋在這個示例中,讀者完成了兩項(xiàng)任務(wù)。首先,將控件綁定到在前一個練習(xí)創(chuàng)建的數(shù)據(jù)源中的一個表。其次,對數(shù)據(jù)綁定進(jìn)行定制,以便在彈出對話框中顯示表Story的Summary字段(長文本字段)。圖3.23 長文本視圖這種定制要求對列進(jìn)行一些操作以及編寫一些定制代碼(但不至于多到不能在本章中介紹)。有必要更詳細(xì)地介紹這些代碼,因?yàn)樗菔玖薉ataGridView的一些很有用的屬性。用戶單擊某個單元格時,將執(zhí)行事件處理程序。代碼首先檢查用戶單擊的列:if (dataGridView1.CurrentCe

24、ll.OwningColumn.DataPropertyName = Summary)DataGridView.CurrentCell用于獲得用戶單擊的單元格。也可以使用事件參數(shù)對象來獲悉,但DataGridViewCellEventArgs類只暴露了單元格的索引。在這種情況下,要確保正確地獲得列,不應(yīng)使用索引,以防列已經(jīng)被刪除、改變了順序等。獲得當(dāng)前單擊的單元格后,使用屬性CurrentCell.OwningColumn.DataProperty檢查它是否引用了數(shù)據(jù)庫中的Summary列。確定用戶單擊了“Show”鏈接后,就可以提取并顯示列值,如下所示: string summaryText

25、 = (dataGridView1.CurrentRow.DataBoundItem as DataRowView).Row as FolkDBDataSet2.StoryRow).Summary; MessageBox.Show(summaryText, Story Summary, MessageBoxButtons.OK);第一行代碼獲得summaryText,這里需要解釋一下:(1)DataGridView.CurrentRow屬性暴露DataGridView的當(dāng)前行,即包含用戶單擊的單元格的行。該屬性是一個DataGridViewRow對象。(2)以這種方式獲得的DataGridVi

26、ewRow對象包含一個DataBoundItem屬性,它暴露綁定到DataGridView的底層數(shù)據(jù),負(fù)責(zé)當(dāng)前行顯示的數(shù)據(jù)。這個屬性是object類型,因?yàn)闆]有限制DataGridView必須綁定到數(shù)據(jù)庫。然而,綁定到數(shù)據(jù)集時,該屬性實(shí)際上是一個DataGridView對象,因此可以將它強(qiáng)制轉(zhuǎn)換為這種類型。(3)DataGridView類有一個Row屬性,用于訪問數(shù)據(jù)集中的數(shù)據(jù)行。該屬性的類型是DataRow,由于使用的類型化數(shù)據(jù)集定義可以知道實(shí)際的行類型,因此可以將它強(qiáng)制轉(zhuǎn)換為適當(dāng)?shù)念愋?。這里的類型是FolkDBDataSet2.StoryRow。(4)通過類型化數(shù)據(jù)集的行FolkDBDat

27、aSet2.StoryRow,可以使用屬性Summary獲得Summary列的值。為保持DataGridView的靈活性,必須采用這種方式。例如,如果采用較簡單的方式,將不能把DataGridView綁定到其他數(shù)據(jù)源。與.NET中的所有東西一樣,如果這是個問題,可創(chuàng)建繼承DataGridView的類,并提供必要的功能使這些更容易實(shí)現(xiàn),但這種復(fù)雜性可能是不必要的。無論如何,所有這些步驟旨在獲得所需的長文本值,并將它顯示給用戶。在下一個練習(xí)中,將把一個外鍵列綁定到相關(guān)數(shù)據(jù)表,以更具可讀性的方式顯示文本。3將ComboBox綁定到父數(shù)據(jù)在這個練習(xí)中,將使用組合框,使編輯列更容易(這并不是本章討論的主

28、題)。下面是如何實(shí)現(xiàn)的步驟:(1)將項(xiàng)目C:BegVC#DatabasesChapter03Ex0303 Large Text復(fù)制為新項(xiàng)目C:BegV C#DatabasesChapter03Ex0304 Parent Binding。(2)在設(shè)計(jì)視圖中打開Form1。(3)在dataGridView1的“DataGridView任務(wù)”窗口中,單擊“編輯列”。(4)將ClassificationId列的類型改為DataGridViewComboButton。(5)按表3.4設(shè)置ClassificationId列的屬性。表3.4 設(shè)置ClassificationId列的屬性屬性值HeaderTe

29、xtClassificationDisplayStyle(無)DataSource數(shù)據(jù)集FolkDBDataSet2中的Classification表(選擇“其他數(shù)據(jù)源”“項(xiàng)目數(shù)據(jù)源”“FolkDBDataSet2”)DisplayMemberClassificationValueMemberClassification(6)單擊“確定”退出“編輯列”對話框。(7)運(yùn)行程序,確定顯示的是人類可讀的分類信息,如圖3.24所示。圖3.24 父綁定的顯示結(jié)果(8)關(guān)閉程序與Visual C#速成版。4解釋通過簡單地調(diào)整一個原本顯示Story表中ClassificationId列的列定義,使其顯示了C

30、lassification表的數(shù)據(jù)。當(dāng)然,也可以通過視圖或其他方法來實(shí)現(xiàn)這一點(diǎn),但這里使用這種方法有一個主要優(yōu)點(diǎn),那就是可以獲得一個組合框。在這個練習(xí)中,組合框被禁用,但可以啟用它以便編輯數(shù)據(jù)。為此,只要將該列的DisplayStyle屬性設(shè)置為其他值:DropDownButton或ComboBox。通過為父項(xiàng)列表添加一個數(shù)據(jù)源(該列表的內(nèi)容和顯示的主要內(nèi)容來自同一個類型化數(shù)據(jù)集),無需再創(chuàng)建數(shù)據(jù)集的實(shí)例。Visual C# Express只是添加一個新的綁定源和一個新的表適配器,以便從Classification表中獲取數(shù)據(jù),并將其存儲到已有的成員變量folkDbDataSet2中。為確保正

31、確運(yùn)行,還需要設(shè)置另外兩個屬性: DisplayMember:指定父表中要顯示的列; ValueMember:父表中鏈接到外鍵值的列,以決定要顯示的數(shù)據(jù)來自父表中的哪行。這通常是父表的主鍵,就像這個例子中那樣。在這個練習(xí)中,很容易確定這些屬性,因?yàn)槌齀D列外只用到一列Classification列。在其他情況下,這些屬性可能沒有這么容易確定,例如,顯示Source表的兩列時。在這種情況下,可以包含更多的列來提供更多信息,并將它們綁定到外鍵表的同一列。編輯數(shù)據(jù)也如此:修改一列的值將自動修改其他列的值,因?yàn)樗鼈兺ㄟ^外鍵值鏈接起來。也可以用另一個DataGridView控件來顯示相關(guān)數(shù)據(jù),這將在本書

32、后面介紹。 BindingNavigator控件BindingNavigator控件是從ToolStrip派生而來的,讓用戶能夠標(biāo)準(zhǔn)界面在數(shù)據(jù)中導(dǎo)航。本質(zhì)上,它是一個ToolStrip控件,包含一些有用的按鈕和指向數(shù)據(jù)源的鏈接。圖3.25顯示了Binding Navigator控件。使用BindingNavigator控件,可以在行間移動:每次移動一行;直接跳到數(shù)據(jù)集的第一行或最后一行;通過輸入數(shù)字跳到指定的行。還有一些按鈕用于在數(shù)據(jù)集中添加(+)、刪除(x)行(對只讀數(shù)據(jù),可以禁用或刪除這些按鈕)。要使用BindingNavigator控件在數(shù)據(jù)集中導(dǎo)航,只需將其BindingSource屬

33、性設(shè)置為BindingSource類的一個實(shí)例。例如,可將其設(shè)置為被綁定到已有控件(如DataGridView)的BindingSource對象。在這種情況下(BindingSource同時綁定到數(shù)據(jù)綁定控件和BindingNavigator控件),BindingNavigator控件將讓用戶能夠在數(shù)據(jù)綁定控件中導(dǎo)航記錄。如果讀者認(rèn)為這聽起來好得令人無法相信,很可能過去花了很多時間編寫代碼來實(shí)現(xiàn)這樣的功能。現(xiàn)在不必這么做了。1使用BindingNavigator控件演示BindingNavigator控件的最好方法是通過示例,因此請執(zhí)行下列步驟:(1)將項(xiàng)目C:BegVC#DatabasesC

34、hapter03Ex0304 Parent Binding復(fù)制為新項(xiàng)目C:BegVC#DatabasesChapter03Ex0305 BindingNavigatorg。(2)在設(shè)計(jì)視圖中打開Form1。(3)添加一個BindingNavigator控件到窗體中。(4)在“BindingNavigator任務(wù)”窗口中,選擇下列選項(xiàng): 嵌入ToolStripContainer中; 停靠填充在窗體中(Dock Fill in Form); 重新設(shè)置控件的父控件(Re-parent Controls); 編輯項(xiàng)。(5)在“項(xiàng)集合編輯器”對話框中,找到“BindingSource”屬性,通過下拉列表

35、將該屬性設(shè)置為storyBindingSource。(6)單擊“確定”退出“項(xiàng)集合編輯器”對話框。(7)刪除編輯和刪除行的按鈕,并刪除這些行左邊的按鈕分隔符。要刪除按鈕或分隔符,先單擊然后再按Delete鍵。(8)運(yùn)行程序,確認(rèn)導(dǎo)航控件能夠正常工作,當(dāng)選擇數(shù)據(jù)網(wǎng)格時,控件能夠自動更新當(dāng)前的位置,如圖3.26所示。圖3.26 使用BindingNavigator控件(9)關(guān)閉程序與Visual C#速成版。2解釋這個練習(xí)的大部分工作都與在窗體中的定位BindingNavigator,以免遮蓋顯示的數(shù)據(jù)有關(guān)。傳統(tǒng)上,在Windows窗體程序中實(shí)現(xiàn)這種功能需要很高的技巧,但Visual C#提供的自

36、動化任務(wù)使得這項(xiàng)工作容易得多。只要按順序單擊一些任務(wù),將自動創(chuàng)建布局,且是比較美觀的布局。將導(dǎo)航器綁定到數(shù)據(jù)需要做的工作實(shí)際很少,雖然這主要是由于已經(jīng)有綁定到BindingSource的DataGridView。通過在BindingNavigator中也使用該BindingSource,就能將所有的對象都集成在一起,并能夠正常運(yùn)行。在這個例子中,所做的其他工作是刪除用于添加和刪除行的按鈕,這是因?yàn)楸菊碌闹攸c(diǎn)是數(shù)據(jù)顯示。 一步添加可導(dǎo)航的DataGridView在完成上一節(jié)后,現(xiàn)在要說的是,實(shí)際上這些步驟都可以跳過,可以一步添加DataGridView和BindingNavigator的組合。為

37、此,首先必須有一個已配置好的數(shù)據(jù)源,通過向?qū)Ш苋菀着渲谩S辛藬?shù)據(jù)源后,就可以在“數(shù)據(jù)源”窗口中將數(shù)據(jù)源層次結(jié)構(gòu)展開到表級,這時選擇表時,將出現(xiàn)一個包含很多選項(xiàng)的下拉列表。這些選項(xiàng)是各種可用于自動將數(shù)據(jù)添加到窗體中的技術(shù),包括本章已介紹過的三種和下面將介紹的一種(“詳細(xì)信息”)。圖3.27顯示了如何選擇DataGridView選項(xiàng)。表名左邊的圖標(biāo)顯示了當(dāng)前為該表選中的選項(xiàng)。在圖3.27中,所有表都選擇了DataGridView選項(xiàng)。選擇DataGridView后,將表拖放到窗體中,這將自動生成一個DataGridView控件和一個BindingNavigator控件,以及所需的類型化數(shù)據(jù)集實(shí)例(

38、如folkDBDataSet2)、Binding Source和表適配器。當(dāng)然,這能夠節(jié)省時間,可能也比以后再添加Binding Navigator更合理。然而,仍需要設(shè)置控件的布局和格式化,包括前面討論過的修改列。這也就是為什么要用這種技術(shù)的原因可以使用更多的技術(shù),而不會陷入這種技術(shù)帶來的復(fù)雜性中。 綁定到詳細(xì)視圖(Detail Views)上面的討論涉及到了詳細(xì)視圖。在這里,詳細(xì)視圖指的是以更直接的方式顯示一行數(shù)據(jù),而不顯示表中的其他數(shù)據(jù)。數(shù)據(jù)不是顯示在DataGridView的一行中,詳細(xì)視圖通常由眾多控件組成,如文本框。這樣可以更好地控制要顯示什么,使顯示的數(shù)據(jù)更具可讀性。例如,可以使

39、用多行文本框來顯示長文本數(shù)據(jù),而不是在一個DataGridView單元格中顯示或像本章前面那樣在彈出對話框中顯示。如果愿意,可以采用自底向上的方法來設(shè)計(jì)詳細(xì)視圖:添加相關(guān)的控件到窗體中,將它們綁定到數(shù)據(jù)源列,然后添加一個用于在行數(shù)據(jù)間導(dǎo)航的BindingNavigator。然而,讓Visual C#完成所有這些繁瑣的工作將容易得多,也快得多。與前一小節(jié)中添加可導(dǎo)航的DataGridView一樣,可通過“數(shù)據(jù)源”窗口完成這些工作。要通過“數(shù)據(jù)源”窗口添加詳細(xì)視圖,需要做兩項(xiàng)準(zhǔn)備工作。首先,在表的下拉列表中選擇“詳細(xì)信息”;其次,確保表中要添加的列與要添加到窗體中的控件相關(guān)聯(lián)。為此,在“數(shù)據(jù)源”窗

40、口中展開表,單擊每列并通過出現(xiàn)的下拉列表進(jìn)行修改,如圖3.28所示。列的數(shù)據(jù)類型不同,可綁定到該列的控件也不同。通過在下拉列表中選擇“自定義”(見圖3.28),可對控件進(jìn)行定制,甚至提供自己的控件。選擇要綁定到的控件類型后,將表拖放到窗體中。圖3.29顯示了得到的結(jié)果(使用圖3.28所示的控件)。 圖3.28 自定義詳細(xì)視圖 圖3.29 添加詳細(xì)視圖與自動生成的DataGridView控件一樣,還需要進(jìn)行一些配置,如調(diào)整生成的控件的大小和位置等。然而,即使在配置前,應(yīng)用程序也是可以運(yùn)行的,通過該應(yīng)用程序可以在數(shù)據(jù)庫中導(dǎo)航和瀏覽其中的數(shù)據(jù)。自動生成的BindingNavigator控件多了一個按

41、鈕:Save Data按鈕。使用這個按鈕可以將對數(shù)據(jù)集的修改存儲到數(shù)據(jù)庫中;下一章將更詳細(xì)地介紹這一點(diǎn)。1綁定到詳細(xì)視圖(1)將項(xiàng)目C:BegVC#DatabasesChapter03Ex0302 Manual Binding復(fù)制為新項(xiàng)目C:BegVC#DatabasesChapter03Ex0306 Detail Binding。(2)在設(shè)計(jì)視圖中打開Form1。(3)在“數(shù)據(jù)源”窗口中,展開FolktaleDBDataSet和Character。(4)在表Character的下拉列表中選擇合適的選項(xiàng),以便能夠使用它來添加詳細(xì)視圖。(5)按表3.5配置表Character中的列。(6)將表C

42、haracter從“數(shù)據(jù)源”窗口拖放到窗體中。(7)調(diào)整字段的位置和大小,使布局美觀些。另外,必須將Notes列綁定到的TextBox控件的MultiLine屬性設(shè)置為True。表3.5 配置表Character中的列列要添加的控件列要添加的控件CharaterIdLabelEmailTextBoxSpeciesId無OccupaionTextBoxNameTextBoxAgeTextBoxGenderTextBoxMotherId無NoesTextBoxFatherId無(8)運(yùn)行程序。結(jié)果如圖3.30所示。圖3.30 父綁定的顯示結(jié)果(9)關(guān)閉程序與Visual C#速成版。2解釋在這個例

43、子中,創(chuàng)建了一個界面,用于查看和導(dǎo)航示例數(shù)據(jù)庫中Character表的行。使用“數(shù)據(jù)源”窗口自動創(chuàng)建了一個詳細(xì)視圖(同時創(chuàng)建了一個BindingNavigator控件),并對生成的控件進(jìn)行部分格式化。在這個例子采用的方式中,有兩點(diǎn)需要注意。首先,Age列顯示在TextBox控件中,而不是讀者可能期望的NumbericUpDown控件中。這是因?yàn)锳ge列允許為空,以便處理像神這樣永恒人物。如果使用NumbericUpDown控件,空值將對顯示的值沒有影響。也就是說,看到的是上一行的Age列值,因此顯示的值是過期的。使用自定義代碼可以解決這種問題,然而,為簡單起見,這個例子沒有使用Numberic

44、UpDown控件,以避免這個問題。其次,省略了相關(guān)的數(shù)據(jù)。其中部分原因是為簡單起見,部分原因是當(dāng)前版本的Visual C#不能很好地處理具有層次結(jié)構(gòu)的數(shù)據(jù)。表Character包含這種數(shù)據(jù),因?yàn)槊啃杏袃蓚€外鍵,它們指向同一個表中的父記錄:關(guān)聯(lián)到人物的父親和母親。要正確地將字段綁定到這些數(shù)據(jù),必須實(shí)現(xiàn)自定義的綁定方案。不幸的是,在Visual C#速成版提供的自動數(shù)據(jù)綁定中還不能實(shí)現(xiàn)這種層次關(guān)系。 過濾數(shù)據(jù)通過對表適配器應(yīng)用額外的查詢,可過濾顯示的數(shù)據(jù)。本章前面介紹了如何添加這樣的查詢,然而,使用可視化工具可以自動地添加過濾器查詢:只要定義要在數(shù)據(jù)綁定控件中應(yīng)用的過濾器即可。同樣,這比想象的要簡

45、單得多,示例最適合演示這一點(diǎn)。1過濾數(shù)據(jù)(1)將項(xiàng)目C:BegVC#DatabasesChapter03Ex0306 Detail Binding復(fù)制為新項(xiàng)目C:BegVC#DatabasesChapter03Ex0307 Filtering。(2)在設(shè)計(jì)視圖中打開Form1。(3)將組成詳細(xì)視圖的控件稍微往下移,為添加一個工具欄騰出空間。(4)在窗體中任何數(shù)據(jù)綁定控件的“任務(wù)”窗口中選擇“添加查詢”。(5)在“查詢條件生成器”窗口中,添加一個新查詢,將命名為FillByGender,查詢的文本如下(見圖3.31),然后單擊“確定”。圖3.31 添加過濾器查詢SELECT CharacterI

46、d, SpeciesId, MotherId, FatherId, Name, Gender, Notes, Email, Occupation, AgeFROM CharacterWHERE Gender = Gender(6)運(yùn)行程序。在窗體頂端的“Gender”文本框中輸入性別(Female或Male),然后單擊“FillByGender”對顯示結(jié)果進(jìn)行過濾,如圖3.32所示。圖3.32 過濾結(jié)果(7)關(guān)閉程序與Visual C#速成版。2解釋在這個例子中,通過添加參數(shù)化查詢對可以查看的數(shù)據(jù)進(jìn)行過濾以及顯示詳細(xì)信息。通過包含查詢,自動生成了: 為類型化數(shù)據(jù)集中Character表的表適配器生成的新查詢; 調(diào)用參數(shù)化查詢的方法,這是在類型化數(shù)據(jù)集的代碼中定義的; 新工具欄; 新工具欄中用于配置和執(zhí)行查詢的標(biāo)簽、文本框和按鈕的組合; 應(yīng)用過濾器(單擊工具欄中的按鈕)時執(zhí)行的代碼。這很好,但有兩個問題要處理。首先,工具欄中按鈕的文本被設(shè)置為新查詢的名稱,這里為FillByGender。這對用戶不是太友好,需要修改;另外,在沒

溫馨提示

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

評論

0/150

提交評論