DataGridView控件詳細(xì)介紹
通過(guò)DataGridView控件,可以顯示和編輯表格式的數(shù)據(jù),而這些數(shù)據(jù)可以取自多種不同類型的數(shù)據(jù)源。
DataGridView控件具有很高的的可配置性和可擴(kuò)展性,提供了大量的屬性、方法和事件,可以用來(lái)對(duì)該控件的外觀和行為進(jìn)行自定義。當(dāng)你需要在WinForm應(yīng)用程序中顯示表格式數(shù)據(jù)時(shí),可以優(yōu)先考慮DataGridView(相比于DataGrid等其它控件)。如果你要在小型網(wǎng)格中顯示只讀數(shù)據(jù),或者允許用戶編輯數(shù)以百萬(wàn)計(jì)的記錄,DataGridView將為你提供一個(gè)易于編程和良好性能的解決方案。
DataGridView 用來(lái)替換先前版本中的DataGrid,擁有較DataGrid更多的功能;但DataGrid仍然得到保留,以備向后兼容和將來(lái)使用。如果你要在兩者中選擇,可以參考下面給出的DataGrid 和DataGridView之間區(qū)別的細(xì)節(jié)信息。
1.1DataGridView和DataGrid 之間的區(qū)別
DataGridView提供了大量的DataGrid所不具備的基本功能和高級(jí)功能。此外,DataGridView 的結(jié)構(gòu)使得它較之DataGrid控件更容易擴(kuò)展和自定義。
下表描述了DataGridView提供而DataGrid未提供的幾個(gè)主要功能。
DataGridView功能 |
描述 |
多種列類型 |
與DataGrid相比,DataGridView 提供了更多的內(nèi)置列類型。這些列類型能夠滿足大部分常見(jiàn)需要,而且比DataGrid中的列類型易于擴(kuò)展或替換。 |
多種數(shù)據(jù)顯示方式 |
DataGrid僅限于顯示外部數(shù)據(jù)源的數(shù)據(jù)。而DataGridView則能夠顯示非綁定的數(shù)據(jù),綁定的數(shù)據(jù)源,或者同時(shí)顯示綁定和非綁定的數(shù)據(jù)。你也可以在DataGridView中實(shí)現(xiàn)virtual mode,實(shí)現(xiàn)自定義的數(shù)據(jù)管理。 |
用于自定義數(shù)據(jù)顯示的多種方式 |
DataGridView提供了很多屬性和事件,用于數(shù)據(jù)的格式化和顯示。比如,你可以根據(jù)單元格、行和列的內(nèi)容改變其外觀,或者使用一種類型的數(shù)據(jù)替代另一種類型的數(shù)據(jù)。 |
用于更改單元格、行、列、表頭外觀和行為的多個(gè)選項(xiàng) |
DataGridView使你能夠以多種方式操作單個(gè)網(wǎng)格組件。比如,你可以凍結(jié)行和列,避免它們因滾動(dòng)而不可見(jiàn);隱藏行、列、表頭;改變行、列、表頭尺寸的調(diào)整方式;為單個(gè)的單元格、行和列提供工具提示(ToolTip)和快捷菜單。 |
唯一的一個(gè)DataGrid提供而DataGridView未提供的特性是兩個(gè)相關(guān)表中數(shù)據(jù)的分層次顯示(比如常見(jiàn)的主從表顯示)。你必須使用兩個(gè)DataGridView來(lái)顯示具有主從關(guān)系的兩個(gè)表的數(shù)據(jù)。
1.2DataGridView的亮點(diǎn)
下表著重顯示了DataGridView的主要特性,稍后會(huì)介紹它們的詳細(xì)信息。
DataGridView控件特性 |
描述 |
多種列類型 |
DataGridView提供有TextBox、CheckBox、Image、Button、ComboBox和Link類型的列及相應(yīng)的單元格類型。 |
多種數(shù)據(jù)顯示方式 |
DataGrid僅限于顯示外部數(shù)據(jù)源的數(shù)據(jù)。而DataGridView則能夠顯示非綁定的數(shù)據(jù),綁定的數(shù)據(jù)源,或者同時(shí)顯示綁定和非綁定的數(shù)據(jù)。你也可以在DataGridView中實(shí)現(xiàn)virtual mode,實(shí)現(xiàn)自定義的數(shù)據(jù)管理。 |
自定義數(shù)據(jù)的顯示和操作的多種方式 |
DataGridView提供了很多屬性和事件,用于數(shù)據(jù)的格式化和顯示。 此外,DataGridView提供了操作數(shù)據(jù)的多種方式,比如,你可以:
|
用于更改單元格、行、列、表頭外觀和行為的多個(gè)選項(xiàng) |
DataGridView使你能夠以多種方式操作單個(gè)網(wǎng)格組件。比如,你可以:
|
提供豐富的可擴(kuò)展性的支持 |
DataGridView提供易于對(duì)網(wǎng)格進(jìn)行擴(kuò)展和自定義的基礎(chǔ)結(jié)構(gòu),比如:
|
2DataGridView的結(jié)構(gòu)
DataGridView及其相關(guān)類被設(shè)計(jì)為用于顯示和編輯表格數(shù)據(jù)式數(shù)據(jù)的靈活的、可擴(kuò)展的體系。這些類都位于system.Windows.Forms命名空間,它們的名稱也都有共同的前綴"DataGridView"。
2.1結(jié)構(gòu)元素(Architecture Elements)
主要的DataGridView相關(guān)類繼承自DataGridViewElement類。
DataGridViewElement類有兩個(gè)屬性,一是DataGridView,該屬性提供了對(duì)其所屬的DataGridView的引用;二是State,該屬性表示當(dāng)前的狀態(tài),其值為DataGridViewElementStates枚舉,該枚舉支持位運(yùn)算,這意味著可以設(shè)置組合狀態(tài)。
2.2單元格和組(Cells and Bands)
DataGridView由兩種基本的對(duì)象組成:?jiǎn)卧?cell)和組(band)。所有的單元格都繼承自DataGridViewCell基類。 兩種類型的組(或稱集合)DataGridViewColumn和DataGridViewRow都繼承自DataGridViewBand 基類,表示一組結(jié)合在一起的單元格。
DataGridView會(huì)與一些類進(jìn)行互操作,但最常打交道的則是如下三個(gè):DataGridViewCell, DataGridViewColumn,DataGridViewRow。
2.3DataGridView的單元格 (DataGridViewCell)
單元格(cell)是操作DataGridView的基本單位。Display is centered on cells, and data entry is often performed through cells。可以通過(guò)DataGridViewRow 類的Cells 集合屬性訪問(wèn)一行包含的單元格,通過(guò)DataGridView的SelectedCells集合屬性訪問(wèn)當(dāng)前選中的單元格,通過(guò)DataGridView的CurrentCell屬性訪問(wèn)當(dāng)前的單元格。
DataGridViewCell 類圖 |
Cell相關(guān)類和屬性 |
DataGridViewCell是一個(gè)抽象基類,所有的單元格類型都繼承于此。DataGridViewCell及其繼承類型并不是Windows Forms控件,但其中一些宿主于Windows Forms控件。單元格支持的編輯功能通常都由其宿主控件來(lái)處理。
DataGridViewCell對(duì)象不會(huì)像Windows Forms控件那樣控制自己的外觀和繪制(painting)特征,相反的,DataGridView會(huì)負(fù)責(zé)其包含的單元格的外觀。通過(guò)DataGridView 控件的屬性和事件,你可以深刻地影響單元格的外觀和行為。如果你對(duì)單元格定制有特殊要求,超出了DataGridView提供的功能,可以繼承DataGridViewCell或者它的某個(gè)子類來(lái)滿足這些要求。
2.3.1DataGridViewCell的工作機(jī)制
理解DataGridView結(jié)構(gòu)的一個(gè)重要部分是理解DataGridViewCell的工作機(jī)制:
單元格的值(A Cell's Value)
單元格的值是其根本所在。如果單元格所在列不是綁定列,并且所在的DataGridView也不是Virtual Mode,那么它的值就由它本身所持有并維護(hù)。對(duì)于那些由綁定產(chǎn)生的單元格,它們壓根兒就不“知道”該持有什么值,當(dāng)然也就不會(huì)去維護(hù)了;當(dāng)DataGridView需要單元格的值的時(shí)候,它會(huì)到數(shù)據(jù)源中查詢?cè)搯卧駪?yīng)當(dāng)顯示的值。在Virtual Mode下,除了會(huì)觸發(fā)CellValueNeeded事件以獲取相應(yīng)單元格的值外,與數(shù)據(jù)綁定方式非常相似。在單元格級(jí),所有這些由DataGridViewCell.GetValue() 方法來(lái)控制。
默認(rèn)情況下,單元格的值的類型為object。當(dāng)一個(gè)列被綁定后,會(huì)設(shè)置它的ValueType屬性,它包含的單元格的ValueType也隨之更新。而單元格的ValueType對(duì)于下一步的格式化非常重要。
格式化顯示(Formatting for Display)
注意:當(dāng)DataGridView需要了解“如何顯示這個(gè)單元格”時(shí),它需要的是單元格的FormattedValue ,而不是Value。這是一個(gè)復(fù)雜的過(guò)程,因?yàn)楦袷交聊簧系囊恍﹥?nèi)容通常需要將它轉(zhuǎn)換為字符串。例如,盡管你將單元格的值(Value)設(shè)置為整型值155,在顯示它的時(shí)候仍需要將其格式化。單元格和其所在的列的FormattedValueType 屬性決定了顯示它時(shí)所用的類型。多數(shù)列使用字符串類型,而Image和CheckBox類型的單元格/列則使用其它類型。Image類型的單元格和列使用Image作為默認(rèn)的FormattedValueType,它的內(nèi)置實(shí)現(xiàn)了解如何去顯示一個(gè)Image。CheckBox類型的單元格/列的FormattedValueType屬性則取決于屬性ThreeState的值。在單元格級(jí),所有這些由DataGridViewCell.GetFormattedValue()控制。
默認(rèn)情況下,DataGridView使用TypeConverter將單元格的值(Value)轉(zhuǎn)換為格式化的值(FormattedValue)。DataGridView會(huì)基于單元格的ValueType和FormattedValueType屬性來(lái)獲取合時(shí)的TypeConverter。
對(duì)于一個(gè)單元格,F(xiàn)ormattedValue會(huì)得到多次請(qǐng)求(即會(huì)在多個(gè)地方用到):繪制單元格的時(shí)候,所在列根據(jù)單元格內(nèi)容自動(dòng)調(diào)整大小的時(shí)候,甚至是在判斷鼠標(biāo)是否經(jīng)過(guò)單元格內(nèi)容時(shí)。每次需要FormattedValue的時(shí)候,DataGridView會(huì)觸發(fā)CellFormatting事件,這時(shí)你就有機(jī)會(huì)修改單元格的格式化顯示了。
如果單元格不能獲取它的格式化值,它會(huì)觸發(fā)DataError事件。
格式化顯示單元格還包含以怎樣的首選尺寸顯示它。這個(gè)首選尺寸是由單元格的FormattedValue,填充區(qū)域(padding),附加顯示和邊框合并而成。
繪制單元格的顯示(Painting the Display)
在獲得FormattedValue 后,單元格將負(fù)責(zé)繪制它的內(nèi)容。單元格決定了繪制過(guò)程所使用的正確樣式(參見(jiàn)本文檔第五章的樣式部分)并進(jìn)行繪制。記?。喝绻麊卧癫蝗ダL制自己,那么該單元格將不會(huì)有任何內(nèi)容得到繪制(即單元格的繪制只由它自己負(fù)責(zé)),行、列不會(huì)負(fù)責(zé)繪制任何內(nèi)容,因此要確保至少要繪制單元格的背景(background),否則單元格所在的矩形區(qū)域仍然是無(wú)效的(即未經(jīng)繪制)。
解析單元格的顯示(Parsing the Display)
用戶開始與單元格交互后,可能會(huì)編輯單元格的值。有一件事要記住,用戶編輯的實(shí)際上是單元格的FormattedValue。用戶提交所編輯的值時(shí),F(xiàn)ormattedValue需要轉(zhuǎn)換回單元格的值(Value),這個(gè)過(guò)程稱為解析(parsing)。在單元格級(jí)上,所有這些工作由單元格的DataGridViewCell.ParseFormattedValue(int rowIndex)方法控制。
默認(rèn)情況下,會(huì)再次使用TypeConverter來(lái)將FormattedValue解析為單元格的真實(shí)值,這時(shí)會(huì)觸發(fā)DataGridView的CellParsing事件,這時(shí)你就有機(jī)會(huì)修改單元格的解析方式了。
如果單元格不能得到正確地解析,會(huì)觸發(fā)DataError事件。
相關(guān)文章
C#中string與byte[]的轉(zhuǎn)換幫助類-.NET教程,C#語(yǔ)言
在寫c#程序時(shí),string和byte[]之間的轉(zhuǎn)換比較煩,在移植一些老程序時(shí)感覺(jué)很不好。我在c#中使用des和tripledes時(shí)移植一塊老代碼時(shí)也遇到了同樣的情況。為了下次不為同樣的事情煩惱,就寫了下面的幫助類。2008-03-03.net程序開發(fā)IOC控制反轉(zhuǎn)和DI依賴注入詳解
這篇文章主要為大家介紹了.net程序開發(fā)IOC控制反轉(zhuǎn)和DI依賴注入示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-11-11ASP.NET?Core使用功能開關(guān)控制路由訪問(wèn)操作(續(xù))
這篇文章主要介紹了ASP.NET?Core使用功能開關(guān)控制路由訪問(wèn)操作的(續(xù)),上一篇文章我們已經(jīng)介紹過(guò)一部份該相關(guān)內(nèi)容,??在本文,我們可以判斷當(dāng)前路由地址是否為調(diào)試地址,讓評(píng)估返回真,需要的小伙伴可以參考一下2022-02-02.net中線程同步的典型場(chǎng)景和問(wèn)題剖析
在使用多線程進(jìn)行編程時(shí),有一些經(jīng)典的線程同步問(wèn)題,對(duì)于這些問(wèn)題,.net提供了多種不同的類來(lái)解決2012-11-11水晶易表調(diào)用C#的WebService,返回?cái)?shù)據(jù)集合的應(yīng)用分析
本篇文章介紹了,水晶易表調(diào)用C#的WebService,返回?cái)?shù)據(jù)集合的應(yīng)用分析。需要的朋友參考下2013-04-04利用ASP.NET技術(shù)動(dòng)態(tài)生成HTML頁(yè)面
利用ASP.NET技術(shù)動(dòng)態(tài)生成HTML頁(yè)面...2006-07-07.Net實(shí)現(xiàn)圖片裁剪圖片縮放及圖片加水印詳解
這篇文章主要為大家介紹了.Net實(shí)現(xiàn)圖片裁剪圖片縮放及圖片加水印實(shí)現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-09-09