1. 程式人生 > >Henry手記:WinForm Datagrid結構剖析(三)

Henry手記:WinForm Datagrid結構剖析(三)

               Henry手記— WinForm Datagrid結構剖析(三)<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

                           韓睿2002-12-18

大家好,很高興又能和大家見面了,不知道大家對前兩篇關於Datagrid結構的文章瞭解得如何,今天討論的問題是在它們基礎上開展的,因此筆者希望您能看一下前兩篇文章以獲得必要的概念。

三、自定義列類

本節主要是和大家一起討論一下怎樣自建一個列類,並加入到Datagrid

中進行使用。在上一節中和大家一起討論了DataGridTextBoxColumn類,並在它基礎上生成了一個繼承自DataGridTextBoxColumn的具有改變cell與行(即一行內的cell的集合)變色能力的DataGridColoredTextBoxColumn類。要實現建立一個列類,應該很好地再次研究一下DataGridTextBoxColumn類,並據此相似的建立一個新類,本次示例是要建立一個具有下拉框的列(如圖1所示),因此,它應該與DataGridTextBoxColumn類是同級的,也就是說它們應該是從同個父類派生出來的,這樣才可以在保證在使用上的相似性與一致性。

 

圖1具有下拉框列的Datagrid

1.何時會用到下拉框?

什麼時候會用到下拉框列,一般來說,是當要在cell中填的內容是確知的幾種可能之一時才會使用。那麼資料來源可能就會來自於兩張資料表,一張是Datagrid整體體現的資料表,另一張是記錄下拉框列表內容的。(當然,下拉框列表內容也可以不存放於資料庫中,只是為了統一管理,筆者習慣於這麼做)。在本例中,Datagrid的資料來源為:

 

圖2Datagrid資料來源

其中,“客戶”表是Datagrid整體顯示出來的內容的源表,由於“國家”列中所填的是確認的幾個國家,因此筆者用“國家”表來記錄在下拉框列表中顯示出來的供使用者選擇的國家名。

2.下拉框列的使用過程

現在來看一下下拉框列的使用過程:

 

    圖3下拉框使用過程演示

從圖3中,我們可以方便的瞭解到下拉框列的處理過程,在平常狀況下,該列中的cell還是以textbox的形式進行顯示的,下拉框的出現是被textbox中落入焦點才激發的,而後,該cell就是一個實實在在的下拉框了,當焦點離開該cell後,cell又恢復成一個textbox的模樣了。

3.類的製作

正式要開工了,先理一下思路,我們要做些什麼事:

(1)DataGridTextBoxColumn類的父類DataGridColumnStyle繼承一個自定義列類:DataGridComboBoxColumn;

(2)在列中加入一個ComboBox例項,用於聚焦後的出現,與DataGridTextBoxColumn類使用的textbox所屬的DataGridTextBox類相似的,我們應該設計一個專用的combobox類提供給DataGridComboBoxColumn類使用。

(3)跟蹤cell的狀態,當聚焦時在textbox的外面新增一個combobox,失去焦點後隱藏起combobox,恢復成textbox;

(4)重寫父類的Edit與Paint方法,以適應Combobox的使用(關於Paint問題的具體討論請見上一節)在Edit中將Combobox中產生的(使用者輸入或在下拉框中選擇)變化記錄入cell中,這也便於在更改後更新到相關的資料來源中去,在本例中,筆者主要是示例實現下拉框與資料來源的繫結功能,因此不支援使用者輸入,反而關注Combobox的DisplayMember與ValueMember屬性,用於體現和資料來源的關係。這點需要讀者注意,如果您希望同時實現使用者輸入(這倒不是Combobox的優點了,對吧?)需要對筆者的程式碼進行適當的修改。

類的程式碼與使用方法請見“(三)類程式碼”與“(三)使用程式碼”兩篇文章。

本節只是從概念角度描述了新建一個列的思路與所需要進行的工作。Datagrid結構剖析也即將告一段落,本系列旨在拋磚引玉,希望給大家一點有益的啟發,有利於學習與工作。接下來,筆者會和大家一起討論Datagrid的事件響應機制與方法,以及與資料庫連線的高階應用。大家也可以寫信給我,告知您對於Datagrid關心的內容,筆者會選擇問題較集中的方面與大家進行新的討論。祝大家學習進步,事業有成!

----

 宣告:本文版權與解釋權歸韓睿所有,如需轉載,請保留完整的內容及此宣告。

QQ: 18349592