winform的DataGridView控件使用大全_第1頁
winform的DataGridView控件使用大全_第2頁
winform的DataGridView控件使用大全_第3頁
winform的DataGridView控件使用大全_第4頁
winform的DataGridView控件使用大全_第5頁
已閱讀5頁,還剩161頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

DataGridView控件使用大全目錄DataGridView控件使用大全 1DataGridView控件 41何為DataGridView 51.1DataGridView和DataGrid之間的區(qū)別 51.2DataGridView的亮點 62DataGridView的結(jié)構(gòu) 62.1結(jié)構(gòu)元素(ArchitectureElements) 72.2單元格和組(CellsandBands) 72.3DataGridView的單元格(DataGridViewCell) 72.3.1DataGridViewCell的工作機制 72.3.2常見問題 82.4DataGridView的列(DataGridViewColumn) 92.5DataGridView的編輯控件(EditingControls) 92.6DataGridViewRow 92.6.1常見問題 103列/單元格類型揭密(column/celltypes) 103.1DataGridViewTextBoxColumn 113.1.1常見問題 113.2DataGridViewCheckBoxColumn 113.3DataGridViewImageColumn 113.3.1常見問題 113.4

DataGridViewButtonColumn 123.5DataGridViewComboBoxColumn 123.5.1DataError事件和ComboBox列 123.5.2常見問題 123.6DataGridViewLinkColumn 124操作數(shù)據(jù)(WorkingwithData) 134.1數(shù)據(jù)輸入和驗證的相關(guān)事件 134.1.1數(shù)據(jù)驗證相關(guān)事件的順序 134.1.2驗證數(shù)據(jù) 144.1.3在新行中的數(shù)據(jù)輸入(DataEntryintheNewRow) 144.2關(guān)于Null值 164.2.1NullValue屬性 164.2.2DataSourceNullValue屬性 164.3DataError事件 17DataError的上下文: 174.4數(shù)據(jù)綁定模式(Databoundmodes) 184.4.1非綁定模式(UnboundMode) 184.4.2綁定模式(BoundMode) 184.4.3虛擬模式 194.4.4混合模式–綁定與非綁定模式 194.4.5

常見問題 195特性綜覽(Overviewoffeatures) 205.1樣式(Styling) 205.1.1TheDataGridViewCellStyleClass 205.1.2UsingDataGridViewCellStyleObjects 215.1.3StyleInheritance 225.1.4SettingStylesDynamically 245.2Custompainting 245.2.1PaintParts 255.2.2RowPrePaintandPostPaint 265.3Autosizing 265.3.1

SizingOptionsintheWindowsFormsDataGridViewControl 275.3.2ResizingwiththeMouse 295.3.3AutomaticSizing 295.3.4ProgrammaticResizing 305.3.5CustomizingContent-basedSizingBehavior 315.3.6Content-basedSizingOptions 315.4Selectionmodes 315.4.1ProgrammaticSelection 325.5滾動(Scrolling) 335.5.1Scrollevent 335.5.2Scrollbars 335.5.3ScrollingProperties 335.6Sorting 335.6.1ProgrammaticSorting 345.6.2CustomSorting 355.6.3

Commonquestionsandscenarios 355.7Borderstyles 365.7.1StandardBorderStyles 365.7.2AdvancedBorderStyles 365.8Enter-Editmodes 375.9Clipboardcopymodes 385.10Frozencolumns/rows 395.11ImplementingCustomcellsandeditingcontrols/cells 395.11.1IDataGridViewEditingControl 395.11.2IDataGridViewEditingCell 395.12Virtualmode 395.12.1BoundModeandVirtualMode 405.12.2SupplementingBoundMode 405.12.3Commonquestionsandscenarios 405.12.4ReplacingBoundMode 405.12.5Virtual-ModeEvents 405.12.6BestPracticesinVirtualMode 425.13容量(Capacity) 426最佳實踐(BestPractices) 426.1UsingCellStylesEfficiently 426.2UsingShortcutMenusEfficiently 436.3UsingAutomaticResizingEfficiently 436.4UsingtheSelectedCells,Rows,andColumnsCollectionsEfficiently 446.5UsingSharedRows 446.6PreventingRowsfromBecomingUnshared 455.1.3樣式繼承 471。DataGridViewCell.Style 485.1.4設(shè)置樣式動態(tài) 495.2風(fēng)俗畫 495.2.1油漆件 495.3Autosizing 505.3.2用鼠標調(diào)整大小 525.3.3自動調(diào)整大小 525.3.5自定義基于內(nèi)容的調(diào)整大小行為 535.3.6基于內(nèi)容的調(diào)整大小選項 535.4選擇模式 545.4.1編程選擇 545.5滾動(滾動) 545.5.1Scroll事件 545.5.2滾動條 555.5.3滾動屬性 555.6排序 55DataGridViewColumnSortMode值描述 555.6.2自定義排序 565.7.1標準邊框樣式 565.10凍結(jié)的列/行 585.11實現(xiàn)自定義和編輯控制細胞/細胞 585.11.1IDataGridViewEditingControl 595.11.2IDataGridViewEditingCell 595.12虛擬模式 595.12.1綁定模式和虛擬模式 595.12.2補充綁定模式 595.12.5虛擬模式事件 59CellContextMenuStripNeeded 60RowHeightInfoNeeded 605.12.6在虛擬模式下的最佳實踐 615.13容量(容量) 616個最佳實踐(最佳做法) 616.1使用高效單元格樣式 616.2使用高效快捷菜單 616.3使用自動調(diào)整大小高效 616.5使用共享行 626.6防止行成為非共享 63附錄A–FAQ 641.如何使指定的單元格不可編輯? 642.如何讓一個單元格不可用(disable)? 64DataGridViewDisableButtonCellcell= 65SolidBrushcellBackground= 663.如何避免用戶將焦點設(shè)置到指定的單元格? 674.如何使所有單元格總是顯示控件(不論它是否處于編輯狀態(tài))? 675.Whydoesthecelltextshowupwith“square”characterswheretheyshouldbenewlines(TODO,未能實現(xiàn)該效果)? 676.如何在單元格內(nèi)同時顯示圖標和文本? 677.如何隱藏一列? 718.如何避免用戶對列排序? 719.如何針對多個列排序? 71CompareResult=System.Stringpare( 7810.如何為編輯控件添加事件處理函數(shù)? 7811.應(yīng)在何時移除編輯控件的事件處理函數(shù)? 7812.如何處理ComboBox列中控件的SelectIndexChanged事件? 7813.如何通過拖放調(diào)整行的順序? 7914.如何調(diào)整最后一列的寬度使其占據(jù)網(wǎng)格的剩余客戶區(qū)? 8115.如何讓TextBox類型的單元格支持換行? 8116.如何使Image列不顯示任何圖像(字段值為null時)? 8217.如何能夠在ComboBox類型的單元格中輸入數(shù)據(jù)? 8218.HowdoIhaveacomboboxcolumndisplayasubsetofdatabaseduponthevalueofadifferentcomboboxcolumn(TODO)? 8319.如何在用戶編輯控件的時候(而不是在驗證時)就顯示錯誤圖標? 8420.如何同時顯示綁定數(shù)據(jù)和非綁定數(shù)據(jù)? 8721.HowdoIshowdatathatcomesfromtwotables(TODO)? 8922.如何顯示主從表? 89MessageBox.Show("Torunthisexample,replacethevalueofthe"+ 9223.如何在同一DataGridView中顯示主從表? 9224.如何避免用戶對列排序? 9225.如何在點擊工具欄按鈕的時候?qū)?shù)據(jù)提交到數(shù)據(jù)庫? 9226.如何在用戶刪除記錄時顯示確認對話框? 92DataGridView控件DataGridView是用于WindowsFroms2.0的新網(wǎng)格控件。它可以取代先前版本中DataGrid控件,它易于使用并高度可定制,支持很多我們的用戶需要的特性。關(guān)于本文檔:本文檔不準備面面俱到地介紹DataGridView,而是著眼于深入地介紹一些技術(shù)點的高級特性。本文檔按邏輯分為5個章節(jié),首先是結(jié)構(gòu)和特性的概覽,其次是內(nèi)置的列/單元格類型的介紹,再次是數(shù)據(jù)操作相關(guān)的內(nèi)容,然后是主要特性的綜述,最后是最佳實踐。大部分章節(jié)含有一個“Q&A”部分,來回答該章節(jié)相關(guān)的一些常見問題。注意,某些問題會由于知識點的關(guān)聯(lián)性重復(fù)出現(xiàn)在多個章節(jié)。這些問題、答案及其附帶的示例代碼都包含在本文檔的附錄部分。

1何為DataGridView通過DataGridView控件,可以顯示和編輯表格式的數(shù)據(jù),而這些數(shù)據(jù)可以取自多種不同類型的數(shù)據(jù)源。DataGridView控件具有很高的的可配置性和可擴展性,提供了大量的屬性、方法和事件,可以用來對該控件的外觀和行為進行自定義。當(dāng)你需要在WinForm應(yīng)用程序中顯示表格式數(shù)據(jù)時,可以優(yōu)先考慮DataGridView(相比于DataGrid等其它控件)。如果你要在小型網(wǎng)格中顯示只讀數(shù)據(jù),或者允許用戶編輯數(shù)以百萬計的記錄,DataGridView將為你提供一個易于編程和良好性能的解決方案。DataGridView用來替換先前版本中的DataGrid,擁有較DataGrid更多的功能;但DataGrid仍然得到保留,以備向后兼容和將來使用。如果你要在兩者中選擇,可以參考下面給出的DataGrid和DataGridView之間區(qū)別的細節(jié)信息。1.1DataGridView和DataGrid之間的區(qū)別DataGridView提供了大量的DataGrid所不具備的基本功能和高級功能。此外,DataGridView的結(jié)構(gòu)使得它較之DataGrid控件更容易擴展和自定義。下表描述了DataGridView提供而DataGrid未提供的幾個主要功能。DataGridView功能描述多種列類型與DataGrid相比,DataGridView提供了更多的內(nèi)置列類型。這些列類型能夠滿足大部分常見需要,而且比DataGrid中的列類型易于擴展或替換。多種數(shù)據(jù)顯示方式DataGrid僅限于顯示外部數(shù)據(jù)源的數(shù)據(jù)。而DataGridView則能夠顯示非綁定的數(shù)據(jù),綁定的數(shù)據(jù)源,或者同時顯示綁定和非綁定的數(shù)據(jù)。你也可以在DataGridView中實現(xiàn)virtualmode,實現(xiàn)自定義的數(shù)據(jù)管理。用于自定義數(shù)據(jù)顯示的多種方式DataGridView提供了很多屬性和事件,用于數(shù)據(jù)的格式化和顯示。比如,你可以根據(jù)單元格、行和列的內(nèi)容改變其外觀,或者使用一種類型的數(shù)據(jù)替代另一種類型的數(shù)據(jù)。用于更改單元格、行、列、表頭外觀和行為的多個選項DataGridView使你能夠以多種方式操作單個網(wǎng)格組件。比如,你可以凍結(jié)行和列,避免它們因滾動而不可見;隱藏行、列、表頭;改變行、列、表頭尺寸的調(diào)整方式;為單個的單元格、行和列提供工具提示(ToolTip)和快捷菜單。唯一的一個DataGrid提供而DataGridView未提供的特性是兩個相關(guān)表中數(shù)據(jù)的分層次顯示(比如常見的主從表顯示)。你必須使用兩個DataGridView來顯示具有主從關(guān)系的兩個表的數(shù)據(jù)。1.2DataGridView的亮點下表著重顯示了DataGridView的主要特性,稍后會介紹它們的詳細信息。DataGridView控件特性描述多種列類型DataGridView提供有TextBox、CheckBox、Image、Button、ComboBox和Link類型的列及相應(yīng)的單元格類型。多種數(shù)據(jù)顯示方式DataGrid僅限于顯示外部數(shù)據(jù)源的數(shù)據(jù)。而DataGridView則能夠顯示非綁定的數(shù)據(jù),綁定的數(shù)據(jù)源,或者同時顯示綁定和非綁定的數(shù)據(jù)。你也可以在DataGridView中實現(xiàn)virtualmode,實現(xiàn)自定義的數(shù)據(jù)管理。自定義數(shù)據(jù)的顯示和操作的多種方式DataGridView提供了很多屬性和事件,用于數(shù)據(jù)的格式化和顯示。此外,DataGridView提供了操作數(shù)據(jù)的多種方式,比如,你可以:對數(shù)據(jù)排序,并顯示相應(yīng)的排序符號(帶方向的箭頭表示升降序)對行、列和單元格的多種選擇模式;多項選擇和單項選擇以多種格式將數(shù)據(jù)拷貝到剪貼板,包括text,CSV(以逗號隔開的值)和HTML改變用戶編輯單元格內(nèi)容的方式用于更改單元格、行、列、表頭外觀和行為的多個選項DataGridView使你能夠以多種方式操作單個網(wǎng)格組件。比如,你可以:凍結(jié)行和列,避免它們因滾動而不可見;隱藏行、列、表頭;改變行、列、表頭尺寸的調(diào)整方式;改變用戶對行、列、單元格的選擇模式;為單個的單元格、行和列提供工具提示(ToolTip)和快捷菜單。自定義單元格、行和列的邊框樣式。提供豐富的可擴展性的支持DataGridView提供易于對網(wǎng)格進行擴展和自定義的基礎(chǔ)結(jié)構(gòu),比如:處理自定義的繪制事件可以為單元格、列和行提供自定義的觀感;繼承一個內(nèi)置的單元格類型以為其提供更多的行為;實現(xiàn)自定義的接口以提供新的編輯體驗。2DataGridView的結(jié)構(gòu)DataGridView及其相關(guān)類被設(shè)計為用于顯示和編輯表格數(shù)據(jù)式數(shù)據(jù)的靈活的、可擴展的體系。這些類都位于system.Windows.Forms命名空間,它們的名稱也都有共同的前綴"DataGridView"。2.1結(jié)構(gòu)元素(ArchitectureElements)主要的DataGridView相關(guān)類繼承自DataGridViewElement類。DataGridViewElement類有兩個屬性,一是DataGridView,該屬性提供了對其所屬的DataGridView的引用;二是State,該屬性表示當(dāng)前的狀態(tài),其值為DataGridViewElementStates枚舉,該枚舉支持位運算,這意味著可以設(shè)置組合狀態(tài)。2.2單元格和組(CellsandBands)DataGridView由兩種基本的對象組成:單元格(cell)和組(band)。所有的單元格都繼承自DataGridViewCell基類。兩種類型的組(或稱集合)DataGridViewColumn和DataGridViewRow都繼承自DataGridViewBand基類,表示一組結(jié)合在一起的單元格。DataGridView會與一些類進行互操作,但最常打交道的則是如下三個:DataGridViewCell,DataGridViewColumn,DataGridViewRow。2.3DataGridView的單元格(DataGridViewCell)單元格(cell)是操作DataGridView的基本單位。Displayiscenteredoncells,anddataentryisoftenperformedthroughcells??梢酝ㄟ^DataGridViewRow類的Cells集合屬性訪問一行包含的單元格,通過DataGridView的SelectedCells集合屬性訪問當(dāng)前選中的單元格,通過DataGridView的CurrentCell屬性訪問當(dāng)前的單元格。

DataGridViewCell

類圖Cell

相關(guān)類和屬性DataGridViewCell是一個抽象基類,所有的單元格類型都繼承于此。DataGridViewCell及其繼承類型并不是WindowsForms控件,但其中一些宿主于WindowsForms控件。單元格支持的編輯功能通常都由其宿主控件來處理。DataGridViewCell對象不會像WindowsForms控件那樣控制自己的外觀和繪制(painting)特征,相反的,DataGridView會負責(zé)其包含的單元格的外觀。通過DataGridView控件的屬性和事件,你可以深刻地影響單元格的外觀和行為。如果你對單元格定制有特殊要求,超出了DataGridView提供的功能,可以繼承DataGridViewCell或者它的某個子類來滿足這些要求。2.3.1DataGridViewCell的工作機制理解DataGridView結(jié)構(gòu)的一個重要部分是理解DataGridViewCell的工作機制:單元格的值(ACell’sValue)單元格的值是其根本所在。如果單元格所在列不是綁定列,并且所在的DataGridView也不是VirtualMode,那么它的值就由它本身所持有并維護。對于那些由綁定產(chǎn)生的單元格,它們壓根兒就不“知道”該持有什么值,當(dāng)然也就不會去維護了;當(dāng)DataGridView需要單元格的值的時候,它會到數(shù)據(jù)源中查詢該單元格應(yīng)當(dāng)顯示的值。在VirtualMode下,除了會觸發(fā)CellValueNeeded事件以獲取相應(yīng)單元格的值外,與數(shù)據(jù)綁定方式非常相似。在單元格級,所有這些由DataGridViewCell.GetValue()方法來控制。默認情況下,單元格的值的類型為object。當(dāng)一個列被綁定后,會設(shè)置它的ValueType屬性,它包含的單元格的ValueType也隨之更新。而單元格的ValueType對于下一步的格式化非常重要。格式化顯示(FormattingforDisplay)注意:當(dāng)DataGridView需要了解“如何顯示這個單元格”時,它需要的是單元格的FormattedValue

,而不是Value。這是一個復(fù)雜的過程,因為格式化屏幕上的一些內(nèi)容通常需要將它轉(zhuǎn)換為字符串。例如,盡管你將單元格的值(Value)設(shè)置為整型值155,在顯示它的時候仍需要將其格式化。單元格和其所在的列的FormattedValueType屬性決定了顯示它時所用的類型。多數(shù)列使用字符串類型,而Image和CheckBox類型的單元格/列則使用其它類型。Image類型的單元格和列使用Image作為默認的FormattedValueType,它的內(nèi)置實現(xiàn)了解如何去顯示一個Image。CheckBox類型的單元格/列的FormattedValueType屬性則取決于屬性ThreeState的值。在單元格級,所有這些由DataGridViewCell.GetFormattedValue()控制。默認情況下,DataGridView使用TypeConverter將單元格的值(Value)轉(zhuǎn)換為格式化的值(FormattedValue)。DataGridView會基于單元格的ValueType和FormattedValueType屬性來獲取合時的TypeConverter。對于一個單元格,F(xiàn)ormattedValue會得到多次請求(即會在多個地方用到):繪制單元格的時候,所在列根據(jù)單元格內(nèi)容自動調(diào)整大小的時候,甚至是在判斷鼠標是否經(jīng)過單元格內(nèi)容時。每次需要FormattedValue的時候,DataGridView會觸發(fā)CellFormatting事件,這時你就有機會修改單元格的格式化顯示了。如果單元格不能獲取它的格式化值,它會觸發(fā)DataError事件。格式化顯示單元格還包含以怎樣的首選尺寸顯示它。這個首選尺寸是由單元格的FormattedValue,填充區(qū)域(padding),附加顯示和邊框合并而成。繪制單元格的顯示(PaintingtheDisplay)在獲得FormattedValue后,單元格將負責(zé)繪制它的內(nèi)容。單元格決定了繪制過程所使用的正確樣式(參見本文檔第五章的樣式部分)并進行繪制。記?。喝绻麊卧癫蝗ダL制自己,那么該單元格將不會有任何內(nèi)容得到繪制(即單元格的繪制只由它自己負責(zé)),行、列不會負責(zé)繪制任何內(nèi)容,因此要確保至少要繪制單元格的背景(background),否則單元格所在的矩形區(qū)域仍然是無效的(即未經(jīng)繪制)。解析單元格的顯示(ParsingtheDisplay)用戶開始與單元格交互后,可能會編輯單元格的值。有一件事要記住,用戶編輯的實際上是單元格的FormattedValue。用戶提交所編輯的值時,F(xiàn)ormattedValue需要轉(zhuǎn)換回單元格的值(Value),這個過程稱為解析(parsing)。在單元格級上,所有這些工作由單元格的DataGridViewCell.ParseFormattedValue(int

rowIndex)方法控制。默認情況下,會再次使用TypeConverter來將FormattedValue解析為單元格的真實值,這時會觸發(fā)DataGridView的CellParsing事件,這時你就有機會修改單元格的解析方式了。.如果單元格不能得到正確地解析,會觸發(fā)DataError事件。2.3.2常見問題1)

如何使指定的單元格不可編輯?2)

如何讓一個單元格不可用(disable)?3)

如何避免用戶將焦點設(shè)置到指定的單元格?4)

如何使所有單元格總是顯示控件(不論它們是否處于編輯狀態(tài))?5)

Whydoesthecelltextshowupwith“square”characterswheretheyshouldbenewlines?6)

如何在單元格內(nèi)同時顯示圖標和文本?2.4DataGridView的列(DataGridViewColumn)DataGridView所附帶的數(shù)據(jù)(這些數(shù)據(jù)可以通過綁定或非綁定方式附加到控件)的結(jié)構(gòu)表現(xiàn)為DataGridView的列。你可以使用DataGridView的Columns集合屬性訪問DataGridView所包含的列,使用SelectedColumns集合屬性訪問當(dāng)前選中的列。DataGridViewColumn

類圖Column

相關(guān)類和屬性一些主要的單元格類型擁有相應(yīng)的列類型,這些列類型繼承自DataGridViewColumn基類。常見問題:1)

如何隱藏一列?2)

如何避免用戶對列排序?3)

如何針對多個列排序?2.5DataGridView的編輯控件(EditingControls)支持高級編輯功能的單元格一般都使用一個繼承自WindowsForms控件的宿主控件,這些控件同時也實現(xiàn)了IDataGridViewEditingControl接口。DataGridViewEditingControlClassdiagramClassesthatimplementEditingControls下表說明了單元格類型、列類型、編輯控件間的關(guān)系:單元格類型宿主控件列類型DataGridViewButtonCelln/aDataGridViewButtonColumnDataGridViewCheckBoxCelln/aDataGridViewCheckBoxColumnDataGridViewComboBoxCellDataGridViewComboBoxEditingControlDataGridViewComboBoxColumnDataGridViewImageCelln/aDataGridViewImageColumnDataGridViewLinkCelln/aDataGridViewLinkColumnDataGridViewTextBoxCellDataGridViewTextBoxEditingControlDataGridViewTextBoxColumn常見問題(FAQ)1)

如何為編輯控件添加事件處理函數(shù)?2)

應(yīng)在何時移除編輯控件的事件處理函數(shù)?3)

如何處理ComboBox列中Combox控件的SelectIndexChanged事件?4)

如何使所有單元格總是顯示控件(不論它是否處于編輯狀態(tài))?2.6DataGridViewRowDataGridViewRow類用于顯示數(shù)據(jù)源的一行數(shù)據(jù)??梢酝ㄟ^DataGridView控件的Rows集合屬性來訪問其包含的行,通過SelectedRows集合屬性訪問當(dāng)前選中的行。DataGridViewRow類圖Row相關(guān)的類和屬性你可以繼承DataGridViewRow類來實現(xiàn)自己的行類型,雖然多數(shù)情況下這并不必要。DataGridView有幾個行相關(guān)的事件和屬性,用以自定義其包含的DataGridViewRow對象的行為。如果你將DataGridView的AllowUserToAddRows屬性設(shè)為true,一個專用于添加新行的特殊行會出現(xiàn)在最后一行的位置上,這一行也屬于Rows集合,但它有一些需要你提起注意的特殊功能,要獲得這方面的更多信息,請參看4.1.3節(jié)。2.6.1常見問題1)

如何通過拖放調(diào)整行的順序?3列/單元格類型揭密(column/celltypes)DataGridView控件提供了幾種列類型用以顯示數(shù)據(jù),并允許用戶修改和添加數(shù)據(jù)。當(dāng)你對DataGridView進行了綁定,并將它的AutoGenerateColumns屬性設(shè)置為true,它會根據(jù)數(shù)據(jù)源中列的數(shù)據(jù)類型自動生成列,這些列都使用相應(yīng)的默認類型(與數(shù)據(jù)源列數(shù)據(jù)類型相適應(yīng))。你也可以自行創(chuàng)建列的實例,將它們加入DataGridView的Columns集合中,這些列可用作非綁定列,也可以以手動方式讓它們用于綁定數(shù)據(jù)。手動綁定的列非常有用,比如,自動生成的列都采用與數(shù)據(jù)源的列相應(yīng)的默認類型,而你不想用默認列類型。下表描述了DataGridView的各種列對應(yīng)的類:列類型描述DataGridViewTextBoxColumn用于基于文本的值。綁定到數(shù)字和字符串值時會自動生成這種類型的列。DataGridViewCheckBoxColumn用于顯示Boolean和CheckState類型的值,綁定到上述類型值時會自動生成這種類型的列。DataGridViewImageColumn用于顯示圖像。綁定到byte數(shù)組,Image對象,圖標對象時會自動生成這種類型的列。DataGridViewButtonColumn用于在單元格內(nèi)顯示按鈕。在綁定時不會自動生成,一般用于非綁定列。DataGridViewComboBoxColumn用于在單元格內(nèi)顯示下拉列表。在綁定時不會自動生成,一般地需要手工綁定。DataGridViewLinkColumn用于在單元格內(nèi)顯示鏈接。在綁定時不會自動生成,一般地需要手工綁定。自定義列類型通過繼承DataGridViewColumn類或其子類,你可以創(chuàng)建自己的列類型,以提供自定義的外觀、行為和宿主控件。常見問題(FAQ)1)

如何隱藏一列?2)

如何使特定的單元格不可編輯?3)

如何避免用戶將焦點設(shè)置到指定的單元格?4)

如何調(diào)整最后一列的寬度使其占據(jù)網(wǎng)格的剩余客戶區(qū)?3.1DataGridViewTextBoxColumnDataGridViewTextBoxColumn是一種通用的列類型,用于表示基于文本的值,比如數(shù)字和字符串。在編輯模式下,會有一個TextBox控件出現(xiàn)在當(dāng)前活動單元格,用戶可以修改單元格的值。單元格的值在顯示時會自動轉(zhuǎn)換為字符串。用戶輸入或修改的值在提交時則被自動解析為合適的數(shù)據(jù)類型以創(chuàng)建一個單元格的值。通過處理CellFoamatting和CellParsing事件,你可以自定義這些轉(zhuǎn)換的方式。比如將數(shù)據(jù)源的日期字段以特定的形式顯示,對某些特殊單元格作出特殊的標記。對一列來說,它包含的單元格值的數(shù)據(jù)類型由該列的ValueType屬性指定。3.1.1常見問題1)

如何讓TextBox類型的單元格支持換行?2)

Whydoesthecelltextshowupwith“square”characterswheretheyshouldbenewlines?3)

如何在單元格內(nèi)同時顯示圖標和文本?4)

如何避免用戶將焦點設(shè)置到指定的單元格?3.2DataGridViewCheckBoxColumnDataGridViewCheckBoxColumn用于顯示Boolean或CheckState類型的值。Boolean值顯示為二元(two-state)或三元(three-state)的CheckBox,而這取決于該列的ThreeState屬性的值。如果該類型的列綁定到CheckState類型的值,ThreeState屬性的默認值為true。一般情況下,CheckBox類型的單元格要么用于存儲數(shù)據(jù),就像其它類型的數(shù)據(jù)一樣,要么用于進行一些重要操作。用戶點擊CheckBox單元格時,如果你希望對此立即做出反應(yīng),可以處理CellClick事件,但該事件發(fā)生在單元格的值更新之前。如果點擊之時就希望獲得新值,一種選擇是根據(jù)當(dāng)前值計算點擊后的值;另一種方法是立即提交值的變化,然后在CellValueChanged事件處理函數(shù)中對此作出反應(yīng),而要在用戶點擊單元格時立即提交值的變化,你必須處理CurrentCellDirtyStateChanged事件,在這里,調(diào)用CommitEnd方法提交新值。3.3DataGridViewImageColumnDataGridViewImageColumn類型的列用于顯示圖像。這種類型的列有三種方法生成:綁定到數(shù)據(jù)源時自動生成;為非綁定列手動生成;在CellFormatting事件處理函數(shù)(該事件發(fā)生在單元格顯示前)中動態(tài)生成。綁定到數(shù)據(jù)源時自動生成Image列的方法適用于大量的圖像格式,包括.NET中Image類支持的各種格式,還有Access數(shù)據(jù)庫及Northwind范例數(shù)據(jù)庫使用的OLE圖片格式。如果你想提供DataGridViewButtonColumn列的功能,又希望顯示自定義的外觀,手動生成Image列會很有用。在顯示后,你可以處理CellClick事件以處理用戶對單元格的點擊(模擬按鈕列)。如果你要為計算值或非圖片的值提供圖片顯示,在CellFormatting事件處理函數(shù)中動態(tài)生成Image列的方法會很有用。比如,你有一個表示風(fēng)險值的列,它的值可能是”high”、”middle”或”low”,可以為它們顯示不同的圖標作為警示;或者你有一個名為”Image”的列,它的值時圖片文件的位置而不是真實的圖片內(nèi)容,也可以用這種方法。3.3.1常見問題1)

如何使Image列不顯示任何圖像(字段值為null時)?3.4

DataGridViewButtonColumn使用DataGridViewButtonColumn列,可以在單元格內(nèi)顯示按鈕。如果你要為用戶操作特定行提供一種簡單的方式,Button列會很有用,比如排序或在另一個窗體中顯示子表記錄。在對DataGridView進行數(shù)據(jù)綁定時不會自動生成Button列,所以你必須手動創(chuàng)建它們,然后把它們添加到DataGridView控件的Columns集合中。你可以處理CellClick事件以響應(yīng)用戶的點擊動作。3.5DataGridViewComboBoxColumn在DataGridViewComboBoxColumn類型的列中,你可以顯示包含下拉列表的單元格。這在僅允許用戶輸入一些特定值的時候顯得很有用,比如在SQLServer示例數(shù)據(jù)庫Northwind中Products表的Category列,它表示產(chǎn)品的種類,這個應(yīng)只允許選擇現(xiàn)有的產(chǎn)品種類,此時就可以使用ComboBox列。如果你了解如何為ComboBox控件生成下拉列表,就可以用相同的方式為ComboBox列中的所有單元格生成下拉列表。要么通過列的Items集合手動添加,要么通過DataSource,DisplayMember和ValueMember屬性綁定到一個數(shù)據(jù)源。要了解其中的更多信息,可以參考WinForms中ComboBox空間的用法。你可以將ComboBox列的單元格的實際值綁定到DataGridView控件本身的數(shù)據(jù)源(注意不是ComboBox列的數(shù)據(jù)源),這需要設(shè)置該列的DataPropertyName屬性(設(shè)置某個列的名稱)。ComboBox列不會在數(shù)據(jù)綁定時自動生成,所以你必須手動創(chuàng)建它們,然后將其添加到Columns集合屬性中。另外,你也可以使用設(shè)計器,在設(shè)計時設(shè)置相應(yīng)的屬性,這個過程類似于在設(shè)計器中ComboBox控件的使用。3.5.1DataError事件和ComboBox列在使用DataGridViewComboBoxColumn時,有時會修改單元格的值或啟動ComboBox控件的Items集合,這樣可能會引發(fā)DataError事件。這是ComboBox列的設(shè)計使然,ComboBox列的單元格會進行數(shù)據(jù)驗證。在ComboBox列的單元格嘗試繪制包含的內(nèi)容時,它需要將包含的值進行格式化(見第二章第三節(jié)),在此轉(zhuǎn)換過程中,它會在ComboBox的Items集合中查找對應(yīng)的值,如果查找失敗,就會引發(fā)DataError事件。忽略了DataError事件可能會使單元格不能進行正確的格式化。3.5.2常見問題1)

如何能夠在ComboBox類型的單元格中輸入數(shù)據(jù)?2)

HowdoIhandletheSelectedIndexChangedevent?3)

HowdoIhaveacomboboxcolumndisplayasubsetofdatabaseduponthevalueofadifferentcomboboxcolumn?3.6DataGridViewLinkColumn使用DataGridViewLinkColumn列,你可以顯示一列包含超鏈接的單元格。在顯示數(shù)據(jù)源中的URL值,或者替代按鈕列進行一些特殊行為,如打開另一個子記錄窗體時會很有用。Link列也不會在DataGridView數(shù)據(jù)綁定時自動生成。要使用它,你還得手動創(chuàng)建,然后將它添加到DataGridView控件的Columns集合中。你可以處理CellContentClick事件來相應(yīng)用戶的點擊動作。這個事件不同于CellClick和CellMouseClick事件,后兩者在用戶點擊單元格任何位置(而不僅僅時鏈接)時都會觸發(fā)。DataGridViewLinkColumn類提供了幾個屬性,用來修改鏈接的外觀,包括點擊前,點擊時和點擊后(類似于網(wǎng)頁中的超鏈接)。4操作數(shù)據(jù)(WorkingwithData)多數(shù)情況下,使用DataGridView的時候都需要跟數(shù)據(jù)打交道,這時有很多事情可能需要你去做。你需要驗證用戶輸入的數(shù)據(jù),或者需要對數(shù)據(jù)進行格式化。DataGridView能夠以三種模式顯示數(shù)據(jù):bound、unboundand和virtual。每種模式都有自己的特性和存在的理由。不管是否是數(shù)據(jù)綁定模式,在操作數(shù)據(jù)時,如果發(fā)生錯誤,DataGridView通常會觸發(fā)DataError事件,理解該事件發(fā)生的原因能讓你更好地利用它。4.1數(shù)據(jù)輸入和驗證的相關(guān)事件用戶輸入數(shù)據(jù)時-對其所在的行或單元格,你可能希望驗證這些數(shù)據(jù),在遇到無效數(shù)據(jù)時通知用戶。就像常見的WindowsForms控件,DataGridView的行和單元格也有Validating和Validated事件,驗證事件可被取消。用戶在單元格/行間移動時會觸發(fā)Enter和Leave事件。最后,用戶在開始編輯單元格時也會觸發(fā)事件。了解所有這些程序的發(fā)生順序會對你很有幫助。4.1.1數(shù)據(jù)驗證相關(guān)事件的順序下面列出validation,enter/leave和begin/end這些事件的順序(當(dāng)EditMode為EditOnEnter時):當(dāng)從一個單元格移動至另一單元格(在同一行內(nèi)):1)

CellLeave(原來的單元格)2)

CellValidating/ed(原來的單元格)3)

CellEndEdit(原來的單元格)4)

CellEnter(新的單元格)5)

CellBeginEdit(新的單元格)當(dāng)從一行移動到另一行:1)

CellLeave(原來的單元格),Rowleave(原來的行)2)

CellValidating/ed(原來的單元格)3)

CellEndEdit(原來的單元格)4)

RowValidating/ed(原來的行)5)

RowEnter(新的行)6)

CellEnter(新的單元格)7)

CellBeginEdit(新的單元格)4.1.2驗證數(shù)據(jù)驗證用戶輸入時,如果DataGridView采用非數(shù)據(jù)綁定模式,通常會對單元格進行驗證;而如果采用數(shù)據(jù)綁定模式,則一般會對行進行驗證。這與數(shù)據(jù)的組織方式密切相關(guān),非數(shù)據(jù)綁定模式下,一行的單元格間關(guān)系一般比較“散”,而綁定模式下,數(shù)據(jù)源的數(shù)據(jù)一般以行來組織。但有時在數(shù)據(jù)綁定模式下會同時進行單元格級和行級的驗證。顯示錯誤信息一旦遭遇了無效的輸入數(shù)據(jù),你通常需要通知用戶。這時有多種方式可以選擇,傳統(tǒng)的方式是使用信息對話框。DataGridView還能夠為行或單元格顯示一個錯誤圖標來通知用戶輸入了無效數(shù)據(jù)。錯誤圖標帶有一個工具提示,它提供了該錯誤的相關(guān)信息:常見問題(FAQ)1)

如何在用戶編輯單元格的時候顯示錯誤圖標?4.1.3在新行中的數(shù)據(jù)輸入(DataEntryintheNewRow)當(dāng)在程序中使用DataGridView來編輯數(shù)據(jù)時,你往往希望提供讓用戶添加新行數(shù)據(jù)的功能。DataGridView控件支持這個功能,提供了一個用于添加新記錄的行,而這一行總是顯示為最后一行,并在該行的標題單元格標以星號(*)。下面的幾個小節(jié)會討論一些在程序中使用這個新行時需要考慮的內(nèi)容。(下面總是以新行表示用于添加新記錄的行)顯示新行使用AllowUserToAddRows屬性以指示是否顯示新行,其默認值為true。新行處于網(wǎng)格的最后一行,標題帶有星號:在數(shù)據(jù)綁定的情況下,當(dāng)DataGridView控件的AllowUserToAddRows屬性和數(shù)據(jù)源的IBindingList.AllowNew屬性都為true時,新行才會顯示,只要兩者有一個為false,新行就不會顯示。為生成的新行添加默認值當(dāng)用戶選擇新行作為當(dāng)前行,DataGridView會觸發(fā)DefaultValuesNeeded事件。在該事件中可以訪問新行,并為其生成默認值,為用戶輸入提供方便。下面這段代碼演示了如何在DefaultValuesNeeded事件中為新行指定默認值。privatevoiddataGridView1_DefaultValuesNeeded(objectsender,

DataGridViewRowEventArgs

e){

e.Row.Cells["Region"].Value="WA";

e.Row.Cells["City"].Value="Redmond";

e.Row.Cells["PostalCode"].Value="98052-6399";

e.Row.Cells["Region"].Value="NA";

e.Row.Cells["Country"].Value="USA";

e.Row.Cells["CustomerID"].Value=NewCustomerId();}Rows集合與新行的關(guān)系新行包含在DataGridView控件的Rows集合中,又因其總是處于最后一行,下面這行代碼會返回新行:DataGridViewRow

row=dataGridView1.Rows[dataGridView1.Rows.Count-1];盡管新行也包含在Rows集合中,它與Rows集合中其它行的行為卻不相同,表現(xiàn)在兩點:不能以編程的方式將新行從Rows集合中移除,如果你嘗試這么做,會拋出InvalidOperationException類型的異常。用戶也不能刪除新行。DataGridViewRowCollection.Clear()方法也不能將新行從Rows集合中移除。不能在新行之后添加行。如果你嘗試這么做,會拋出InvalidOperationException類型的異常。這種特性的結(jié)果是,新行總處于DataGridView的最后一行。當(dāng)新行顯示的時候,DataGridViewRowCollection類中用于添加行的方法-Add,AddCopy以及AddCopies-在內(nèi)部都調(diào)用用于插入的方法。在新行中輸入數(shù)據(jù)用戶開始在新行輸入數(shù)據(jù)之前,新行的IsNewRow屬性值為true;一旦用戶開始輸入,這一行就不再是新行了,DataGridView中會產(chǎn)生一個“新”的新行,看下面示意圖:在添加“新”的新行時,會觸發(fā)UserAddedRow事件,它的事件處理函數(shù)的第二個參數(shù)有屬性Row,指定了這個“新”的新行。如果用戶此時按下Escape鍵,“新”的新行會被移除,這會觸發(fā)UserDeletingRow事件,它的事件處理函數(shù)的第二個參數(shù)的屬性Row指定了“新”的新行。自定義新行的可視化效果新行是基于RowTemplate模板創(chuàng)建的,如果沒有指定它的單元格的樣式,它們會采用繼承的樣式。要了解樣式繼承的更多信息,請參看第五章第一節(jié)的內(nèi)容。新行中單元格的初始值是由每個單元格的DefaultNewRowValue屬性決定的。對于DataGridViewImageCell類型的單元格,其初始值為一個占位圖片,其它類型的則為null。你可以重寫這個屬性以返回自定義值。但也可以在DefaultValuesNeeded事件處理函數(shù)中對默認值進行替換,該事件在焦點進入新行時觸發(fā)。新行標題的標準圖標是箭頭或者星號,并沒有得到暴露。如果你要自定義這個圖標,就需要創(chuàng)建一個自定義的DataGridViewRowHeaderCell類。新行的標題的標準圖標使用標題單元格DataGridViewCellStyle的ForeColor屬性。注意:如果沒有足夠的空間,圖標就不會再顯示。如果為標題單元格設(shè)置了字符串值(通過Value屬性),但沒有足夠的控件同時顯示文本和圖標,那么圖標會被首先截掉。新行的排序在非綁定模式下,新行總是添加在DataGridView的最后一行,即使已經(jīng)對數(shù)據(jù)排序。用戶需要在添加新行后再次進行排序,以將新記錄放在合適的位置;這種行為方式類似于ListView控件。在綁定模式或虛擬模式(VirtualMode)下,如果已對數(shù)據(jù)排序,那么插入數(shù)據(jù)時的行為取決于數(shù)據(jù)模型的實現(xiàn)方式。對于ADO.NET,新加的行會被自動排序至合適的位置。關(guān)于新行,還要注意:你不能將新行的Visible屬性值設(shè)置為false,否則會觸發(fā)一個InvalidOperationException類型的異常。新行在創(chuàng)建時總是處于非選中(unselected)狀態(tài)。VirtualMode下的新行如果你正要實現(xiàn)虛擬模式(VirtualMode),需要考慮數(shù)據(jù)模型添加新行和回滾添加操作的情況。該功能準確的實現(xiàn)方式取決于數(shù)據(jù)模型的實現(xiàn)方式及其事務(wù)機制,例如,提交的時候是針對單元格還是行。參看本文檔后面關(guān)于VirtualMode的主題。4.2關(guān)于Null值在使用數(shù)據(jù)源的時候,比如數(shù)據(jù)庫或業(yè)務(wù)對象,經(jīng)常需要處理null值。null值可能是一個實際的null(VB中為Nothing),也可能是一個數(shù)據(jù)庫的”null”值(DBNull.Value),當(dāng)你遭遇了這些值,就需要考慮如何顯示它們。另一方面,很多時候,你還需要向數(shù)據(jù)源寫入null值。使用單元格Style的NullValue屬性和DataSourceNullValue屬性,你可以改變DataGridView處理null值的方式。4.2.1NullValue屬性DataGridViewCellStyle.NullValue屬性本來要被命名為FormattedNullValue的,但是后來沒來得及作出這個更改。但它能給我們帶來一點提示——顧名思義,在格式化時會用到它。如果一個單元格的值為”null”(等于null或DBNull.Value),它會使用你設(shè)置的NullValue屬性來顯示。該屬性的默認值取決于所在列的類型,見下圖:DataGridView列類型列的DefaultCellStyle.NullValue值TextBoxColumnString.Empty(“”)ImageColumn空的圖像()ComboBoxColumnString.Empty(“”)ButtonColumnString.Empty(“”)LinkColumnString.Empty(“”)CheckBoxColumn默認值取決于ThreeState屬性的值,如果為true,默認值為CheckState.Indeterminate,否則為unchecked。有一點要了解,在用戶輸入數(shù)據(jù)時也會用到NullValue。例如,若用戶向TextBox類型單元格輸入了string.Empty,那么會將null作為該單元格的值。查看下面的DataSourceNullValue屬性以了解究竟是輸入了什么作為單元格的值。4.2.2DataSourceNullValue屬性DataGridViewCellStyle.DataSourceNullValue屬性要被命名為ParseNullValue的,如果NullValue屬性被命名為FormattedNullValue的話,但最后還是采用了DataSourceNullValue,這樣更直觀準確。在將null值寫入單元格的值時,就會用到DataSourceNullValue屬性。在數(shù)據(jù)綁定情形下,這個null值將被寫入數(shù)據(jù)庫或業(yè)務(wù)對象,此處需要進行控制,因為對于數(shù)據(jù)庫和業(yè)務(wù)對象來說,null的概念不盡相同。通常你會期望,使用業(yè)務(wù)對象時將DataSourceNullValue設(shè)置為null,而使用數(shù)據(jù)庫時則將其設(shè)置為DBNullValue。DataSourceNullValue的默認值為DBNull.Value。4.3DataError事件將DataError事件獨立出來作為一個主題,是因為在操作數(shù)據(jù)時,經(jīng)常會遭遇DataError事件。在操作數(shù)據(jù)時,DataError主要發(fā)生在一下情況:不能讀/寫或轉(zhuǎn)換單元格的數(shù)據(jù);在嘗試進行某種編輯操作時發(fā)生了異常。編輯操作中的DataError

事件下面的列表列出了可能會引發(fā)DataError事件的編輯操作:取消編輯(Cancelinganedit)刷新一個編輯(通過調(diào)用RefreshEdit方法)嘗試將單元格的值寫入數(shù)據(jù)源初始化編輯控件\單元格的值(通過設(shè)置單元格的FormattedValue屬性或調(diào)用單元格的InitializeEditingControl方法)結(jié)束編輯(Endinganedit)提交編輯(Committinganedit)刪除一行(Deletingarow)

DataError的上下文:下面的列表顯示了不同的DataError上下文環(huán)境,然后進一步說明了這些上下文環(huán)境合適可能發(fā)生:DataErrorContext何時發(fā)生FormattingWhenattemptingtoretrievethecell'sformattedvalue.DisplayWhenattemptingtopaintthecellorcalculatethecell'stooltiptext.Notethattheseoperationsusuallyalsorequiregettingthecell'sformattedvalue,sotheerrorcontextisOR'dtogether.PreferredSizeWhencalculatingthepreferredsizeofacell.This

usuallyalsorequiresgettingthecell'sformattedvaluealso.RowDeletionAnyexceptionraisedwhendeletingarow.ParsingWhenexceptionsoccurwhencommitting,endingorcancelinganedit.UsuallyOR'dinwithothererrorcontextsCommitWhenexceptionsoccurwhencommittinganedit.UsuallyOR'dwithothererrorcontextsInitialValueRestorationWhenexceptionsoccurwhileeitherinitializingtheeditingcontrol/cell'svalue,orCancelinganeditLeaveControlWhenexceptionsoccurwhileattemptingtovalidategriddatawhenthegridislosingfocus.UsuallyOR'dwithothererrorcontexts.CurrentCellChangeWhenexceptionsoccurwhilevalidating\updating\committing\gettingcellcontentwhenthecurrentcellchanges.UsuallyOR'dwithothererrorcontexts.ScrollWhenexceptionsoccurwhilevalidating\updating\committing\gettingcellcontentwhenthecurrentcellchangesasaresultofscrolling.ClipboardContentWhenexceptionsoccurwhileattemptingtogettheformattedvalueofacellwhilecreatingtheclipboardcontent.4.4數(shù)據(jù)綁定模式(Databoundmodes)4.4.1非綁定模式(UnboundMode)如果你要在程序中管理數(shù)量相對較小的數(shù)據(jù),那么非綁定模式會比較合適。此時你不是像綁定模式中那樣將DataGridView控件直接指向一個數(shù)據(jù)源,而是手動去生成控件。一般需要用到DataGridViewRowCollection.Add方法(該方法向DGV中添加行)。非綁定模式在處理靜態(tài)、只讀的數(shù)據(jù)時特別有用,也可以用在以自己的方式與外部數(shù)據(jù)源交互的情況,但實際上,如果你希望你的用戶與外部的數(shù)據(jù)源交互,一般還是用綁定模式(boundmode)更好。4.4.2綁定模式(BoundMode)如果你在程序中管理一些數(shù)據(jù),并希望能與數(shù)據(jù)源自動進行交互,就應(yīng)該使用綁定模式。此時你可以設(shè)置DataSource屬性,將數(shù)據(jù)源綁定到DataGridView控件。如果控件使用了綁定模式,就不需要你去顯式地對數(shù)據(jù)進行讀寫了。如果AutoGenerateColumns屬性為true,數(shù)據(jù)源中的每一列都會在DataGridView中生成一個相應(yīng)的列(根據(jù)列的數(shù)據(jù)類型),如果你希望創(chuàng)建自己的列,可以將該屬性設(shè)置為false,使用DataPropertyName屬性將一列綁定到數(shù)據(jù)源的一列,這在你不想用自動生成的列類型時很有用。有效的數(shù)據(jù)源將數(shù)據(jù)綁定到DataGridView非常簡單、直觀,很多情況下,你只需要設(shè)置它的DataSource屬性。如果使用的數(shù)據(jù)源包含多個列表(list)或數(shù)據(jù)表(table),你還需要設(shè)置控件的DataMember屬性,該屬性為字符串類型,用于指定要綁定的列表或數(shù)據(jù)表。DataGridView控件支持標準的WinForm數(shù)據(jù)綁定模型,因此它可以綁定到下面列表中的類的實例:任意實現(xiàn)了IList接口的類,包括一維數(shù)組;任意實現(xiàn)了IListSource接口的類,比如DataTable和DataSet;任意實現(xiàn)了IBindingList接口的類,比如BindingList;任意實現(xiàn)了IBindingListView接口的類,比如BindingSource。列表更改通知(ListChangeNotification)當(dāng)你將數(shù)據(jù)綁定到列表時,最重要的功能之一便是支持列表更改通知了。這只有在你希望列表(即數(shù)據(jù)源)發(fā)生變化,如添加、修改和刪除,DataGridView能夠隨之更新的時候,該功能才顯得重要。只有實現(xiàn)了IBindingList接口的數(shù)據(jù)源支持更改通知。像數(shù)組和集合這樣的列表默認情況下不支持更改通知。在選擇數(shù)據(jù)源時,BindingSource組件應(yīng)該作為首選,因為它可以綁定到多種類型的數(shù)據(jù)源,并且能夠自動處理很多數(shù)據(jù)綁定相關(guān)的事務(wù)。一般情況下,應(yīng)該將DataGridView綁定到BindingSource組件,并將BindingSource組件綁定真正的數(shù)據(jù)源(它的作用就像DGV和數(shù)據(jù)源間的橋梁)。BindingList<T>類也可以在一個類的基礎(chǔ)上創(chuàng)建自定義列表(list)。對象更改通知(ObjectChangeNotification)如果你有了一個數(shù)據(jù)源,那么數(shù)據(jù)源中的對象就可以實現(xiàn)對public屬性的更改通知。這需要你為相應(yīng)屬性提供一個”PropertyNameChanged”事件,或者實現(xiàn)INotifyPropertyChanged接口。INotifyPropertyChanged是在VS2005中新加的接口,可以與BindingList<T>一起使用來創(chuàng)建可綁定的列表(list)。但當(dāng)你的數(shù)據(jù)源是BindingSource,那就不用再額外實現(xiàn)更改通知了。4.4.3虛擬模式使用虛擬模式,你可以實現(xiàn)自己的數(shù)據(jù)管理操作。在綁定模式下,如果要使用非綁定列,那么要想在對列排序時能夠維護非綁定列的值,就需要虛擬模式。但虛擬模式的最主要的用途還是在操作大量數(shù)據(jù)時優(yōu)化性能。你將DataGridView綁定到緩存的數(shù)據(jù),然后用代碼控制數(shù)據(jù)行的存取。要保持使用內(nèi)存量比較小,緩存的數(shù)據(jù)量應(yīng)與當(dāng)前要顯示的行數(shù)相當(dāng)。當(dāng)用戶滾動控件看到了新的行時,你的代碼就從緩存中請求新的數(shù)據(jù),并從內(nèi)存中清除舊的數(shù)據(jù)。如果你正要實現(xiàn)虛擬模式(VirtualMode),需要考慮數(shù)據(jù)模型添加新行和回滾添加操作的情況。該功能準確的實現(xiàn)方式取決于數(shù)據(jù)模型的實現(xiàn)方式及其事務(wù)機制,例如,提交的時候是針對單元格還是行。參看本文檔后面關(guān)于VirtualMode的主題。4.4.4混合模式–綁定與非綁定模式顯示在DataGridView中的數(shù)據(jù)通常來自于某種類型的數(shù)據(jù)源,但是你可能也希望顯示一個數(shù)據(jù)源之外的列。這種列稱為非綁定列。你可以在綁定模式下添加非綁定列,在你希望顯示一個按鈕列或者鏈接列讓用戶操作一些特定行時這顯得很有用,另外也可以用非綁定列顯示一些由綁定列計算而得到的值。你可以在CellFormatting事件處理函數(shù)中生成計算列的值。不過如果你使用的數(shù)據(jù)源是DataSet或DataTable,你可能希望使用DataColumn.Expression屬性來創(chuàng)建一個計算列,在這種情況下,在DGV看來,這一列就跟數(shù)據(jù)源中其它列是一樣的。在綁定模式下根據(jù)非綁定列排序是不受支持的。如果你在綁定模式下創(chuàng)建了非綁定列,你必須實現(xiàn)虛擬模式,這樣在根據(jù)綁定列排序時可以維護非綁定列的值。如果添加的非綁定列不能由數(shù)據(jù)源數(shù)據(jù)計算得來或者這些數(shù)據(jù)會頻繁更新,你就應(yīng)該使用虛擬模式。要了解虛擬模式的更多信息,請參看本文檔后面的虛擬模式相關(guān)章節(jié)。4.4.5

常見問題1)

如何同時顯示綁定數(shù)據(jù)和非綁定數(shù)據(jù)?2)

HowdoIshowdatathatcomesfromtwotables?(TODO)3)

如何顯示主從表?4)

如何在同一DataGridView內(nèi)顯示主從表?5)

如何避免對一列的排序?6)

如何針對多個列排序?7)

HowdoIhaveacomboboxcolumndisplayasubsetofdatabaseduponthevalueofadifferentcomboboxcolumn?(TODO)8)

如何在點擊工具欄按鈕的時候?qū)?shù)據(jù)提交到數(shù)據(jù)庫?9)

如何在用戶刪除記錄時顯示確認對話框?5特性綜覽(Overviewoffeatures)5.1樣式(Styling)DataGridView使得定義單元格的基本外觀和格式化單元格顯示變得簡單。您可以定義的外觀和在特定的列和行,或在通過各種設(shè)置DataGridView控件屬性訪問的DataGridViewCellStyle對象的屬性控制所有細胞的單個單元格的格式樣式。此外,您可以修改,如通過處理CellFormatting事件的單元格值因素的基礎(chǔ)上動態(tài)這些樣式。

DataGridView控件中的每一個細胞都可以擁有如文本格式,背景色,前景色和字體自己的風(fēng)格。但是,通常多個單元格將分享獨特的風(fēng)格特點。

細胞群體共享樣式可能包括在特定行或列的所有單元格包含特定值,或控件中的所有細胞的所有細胞。由于這些群體重疊,每個單元可能會從多個位置的樣式??信息。例如,您可能會希望每個在DataGridView控件使用相同的字體細胞,只有細胞貨幣列,但使用貨幣格式,負數(shù)和貨幣細胞只使用紅色前景色。Youcandefineappearanceandformattingstylesforindividualcells,forcellsinspecificcolumnsandrows,orforallcellsinthecontrolbysettingthepropertiesoftheDataGridViewCellStyleobjectsaccessedthroughvariousDataGridViewcontrolproperties.Additionally,youcanmodifythesestylesdynamicallybasedonfactorssuchasthecellvaluebyhandlingtheCellFormattingevent.EachcellwithintheDataGridViewcontrolcanhaveitsownstyle,suchastextformat,backgroundcolor,foregroundcolor,andfont.Typically,however,multiplecellswillshareparticularstylecharacteristics.Groupsofcellsthatsharestylesmayincludeallcellswithinparticularrowsorcolumns,allcellsthatcontainparticularvalues,orallcellsinthecontrol.Becausethesegroupsoverlap,eachcellmaygetitsstylinginformationfrommorethanoneplace.Forexample,youmaywanteverycellinaDataGridViewcontroltousethesamefont,butonlycellsincurrencycolumnstousecurrencyformat,andonlycurrencycellswithnegativenumberstousearedforegroundcolor.5.1.1TheDataGridViewCellStyleClassTheDataGridViewCellStyleclasscontainsthefollowingpropertiesrelatedtovisualstyle:BackColorandForeColor,SelectionBackColorandSelectionForeColor,FontThisclassalsocontainsthefollowingpropertiesrelatedtoformatting:FormatandFormatProvider,NullValueandDataSourceNullValue,WrapMode,Alignment,PaddingDataGridViewCellStyle類包含以下有關(guān)視覺樣式屬性:

背景色和前景色,SelectionBackColor和SelectionForeColor,字體

此類還包含了相關(guān)的格式如下屬性:

格式和FormatProvider,并DataSourceNullValue的NullValue,的WrapMode,對齊,填充5.1.2UsingDataGridViewCellStyleObjectsYoucanr

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論