<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      .NET組件控件實例編程系列——3.DataGridView列標題可編輯組件

      在上一篇中介紹了用Label控件模擬網頁鏈接的組件,實現原理只是簡單的將Label控件的事件進行了處理。本篇中介紹的DataGridView列標題可編輯組件在對DataGridView控件的事件進行處理的同時,加入了更多的技巧。

      首先介紹本示例要實現的效果。WinForm中的DataGridView控件只能對單元格進行編輯,但有時候需要對列標題進行編輯,即自定義列標題。本組件就是實現列標題編輯的功能,雙擊列標題即可進行編輯,支持鍵盤左右鍵移動編輯單元格。編輯效果如下圖。(注:雙擊列標題對某些數據源會執行排序操作,如果需要避免,可以自行修改為通過右鍵菜單選擇開始編輯。)

      DataGridView列標題可編輯組件示例

      上面介紹了需要實現什么效果,但DataGridView的列標題是不提供編輯的,那如何實現編輯呢?這里用了一個RichTextBox控件去模擬編輯狀態,將RichTextBox控件覆蓋到需要編輯的列標題上方,看起來就像是對列標題進行編輯一樣。這個例子就比上一個稍微復雜一點,不僅僅是處理幾個簡單的事件了。下面就介紹實現的過程。

      首先新建一個項目,選擇項目類型為類庫,輸入項目名稱DataGridViewColumnHeaderEditor,然后添加組件DataGridViewColumnHeaderEditor。具體的操作步驟在上一篇已經介紹過了,就不詳細闡述。
      和上一篇中介紹的組件一樣,首先必須給組件指定一個操作目標。這里要操作的是DataGridView,所以添加一個DataGridView類型的屬性,另外添加了一個屬性指示是否允許編輯,代碼如下:
      上面提到了用一個RichTextBox控件去模擬編輯效果,那么這里就需要添加一個RichTextBox控件。切換到組件的設計視圖,從工具箱中拖動一個RichTextBox控件到組件中。設置RichTextBox控件的相關屬性,將MultiLine、TabStop和Visible均設置為False。
      啟用編輯的操作是雙擊列標題,那么就需要對DataGridView控件的列標題雙擊事件進行處理。上一篇中介紹了窗體背后的故事,是通過設置屬性的時候綁定事件處理程序的,也提到了用另一種方法實現,那就是ISupportInitialize接口。本例就采用這種方法來把控件的事件和對應的事件處理程序綁定。

      Code

       

      下面介紹一下ISupportInitialize接口。參考MSDN中的介紹,ISupportInitialize接口:指定該對象支持對批初始化的簡單的事務處理通知。該接口包含兩個方法BeginInit和EndInit,在該接口的備注中有如下說明:
      ISupportInitialize 允許控件為多組屬性而優化。因此,可以在設計時初始化相互依賴的屬性或批設置多個屬性。
      調用 BeginInit 方法用信號通知對象初始化即將開始。調用 EndInit 方法用信號通知初始化已完成。

      下面做個試驗,往一個窗體上放置一個DataGridView控件,回到窗體的設計器代碼Designer.cs中,可以看到在InitializeComponent方法中有如下代碼:

      Code

      可以看出這個接口的方法是在窗體初始化的時候被調用的。如果需要對控件或者組件進行初始化,可以在BeginInit中進行,如果需要在初始化完成之后進行其他相關的操作,可以在EndInit中進行。本例把綁定事件與處理方法的操作放在了EndInit中,代碼如下:

      Code

      在EndInit方法中,首先判斷目標控件是否為空,然后將RichTextBox添加到目標控件的父控件中并前置,這樣才能在編輯的時候覆蓋在DataGridView控件上。之后是ReloadSortedColumnList方法,該方法獲取列對象列表,并且按照顯示序號進行排序。因為DataGridViewColumn有兩個序號,一個是Index,是在DataGridView控件的Columns中的序號,另一個是DisplayIndex,是實際顯示的序號。用戶可能調整列的順序,有些列可能是隱藏的,如果從DataGridView控件的Columns屬性中按Index操作可能發生錯誤。比如在DataGridView控件的Columns中Index為2的列可能DisplayIndex為0。用鍵盤操作編輯框從Index為3且DisplayIndex為3的列向左移動的時候,跳到序號為2的列上,顯示給用戶就是從第3列跳到第0列。最后就是將DataGridView控件的事件綁定到相關的事件處理方法上。以下就是事件處理方法的代碼:

      Code

      從代碼里可以看到,列增減以及序號改變都需要重新加載列表排序,雙擊則顯示編輯效果,另一個就是DataGridView控件的滾動條操作。為什么需要對滾動條事件進行處理?因為這里是用一個RichTextBox控件模擬的編輯狀態,如果不處理,列標題的位置變了,編輯框卻還定在那里,就會錯位了。而且列的坐標會隨著滾動條操作發生改變,如果不記錄滾動條的位置,在雙擊列標題時就會得到一個列標題的內部相對坐標,但RichTextBox是按照外部絕對坐標顯示的,這樣也會發生錯位。而DataGridView控件沒法直接獲取滾動條的位移,所以只好在滾動條事件中記錄滾動條的位移了。(注意:在其他帶滾動條的控件中確定子控件的位置也需要考慮滾動條。
      綁定好DataGridView控件的事件處理方法之后,就是對RichTextBox控件的操作了。編輯框需要處理鍵盤操作以實現移動和完成編輯的操作,對應方法是rtbTitle_KeyDown。編輯框失去焦點時也要作為編輯完成的動作,對應方法是rtbTtile_Leave方法。ShowHeaderEdit方法是顯示編輯效果的,主要是確定編輯框的位置和大小,把對應列的標題顯示到編輯框中。這里不允許輸入空的標題,如果需要,可以根據實際情況修改代碼。另外其中加入了一些事件,用來更加靈活控制編輯操作。關于事件,稍后再詳細介紹。

      Code

      在上面對編輯框操作的相關方法中,又涉及到了對列對象的一些操作,比如獲取相對坐標,左右移動時獲取鄰近顯示的列。下面就是這些方法的代碼。

      Code

      以上方法都比較簡單,不再詳細解釋。下面就介紹事件。在類中聲明了三個事件,代碼如下:

      Code

      BeginEdit事件是在編輯開始的時候發生的,如果有一些列不允許編輯,則可以在該事件處理方法中捕獲并取消。
      EndingEdition事件是在編輯即將結束的時候發生的,如果用戶輸入的列標題不合理,可以取消結束編輯,強制用戶繼續編輯。
      EndEdit事件是在編輯結束后發生的,通知外部被編輯的列的相關信息。
      這些事件的類型都是ColumnHeaderEditEventHandler,如下是該事件委托的定義以及事件參數的定義。如果對事件和委托不是很了解,請先查閱相關資料,這里不作詳細闡述。

      小技巧——事件委托和事件參數相關
      通常事件委托的名稱定義為事件相關名稱+EventHandler,比如MouseEventHandler,PaintEventHandler,CancelEventHandler,FormClosedEventHandler。事件委托一般包含兩個參數格式,定義格式如public delegate void MyEventHandler(object sender, MyEventArgs e)。而事件參數一般定義為事件相關名稱+EventArgs,比如DragEventArgs,ListChangedEventArgs,NavigateEventArgs,MouseEventArgs。事件參數中的屬性一般是不可修改的,即沒有set段,是通過構造函數指定的。如果需要通過參數影響事件的行為,則會存在set段。

      Code

      小技巧——引發事件的方法
      如果在一個類中存在多個地方引發同一個事件,可以考慮用一個方法代替。因為引發事件之前都必須判斷該事件委托是否為空,否則直接引發事件可能出錯。示例如下:

      Code

       

      至此,組件的編碼就完成了,類圖如下。
      DataGridViewColumnHeaderEditor類圖
      小技巧——查看類圖的方法
      對項目添加新項,選擇“類關系圖”,然后把需要查看的類從解決方案管理器中拖動到類圖即可。也可以在類圖中直接添加新項,用類圖去設計類和其他對象。

      編譯一下。然后添加測試的Windows應用程序項目,在窗體上放置一個DataGridView控件,對該控件添加幾列。然后拖動DataGridViewColumnHeaderEditor組件到窗體上,設置組件的TargetControl屬性為之前添加的DataGridView控件。按F5運行,雙擊列標題即可編輯,回車或者用鼠標點擊別處可完成編輯,也可以通過鍵盤左右方向鍵移動編輯框。

      本例相比上一個例子,稍微復雜一點,添加了接口實現和自定義事件。這里也提供了一種間接解決問題的思路,雖然DataGridView控件本身不支持編輯列標題,但可以用一個RichTextBox去模擬編輯狀態。通過這個例子,可以引申出其他解決方案,比如對樹節點用下拉框編輯,用ListView或者DataGridView讓下拉框顯示多列等等。具體的應用就要靠自己實踐了,希望這篇文章能給您帶來收獲。

      另外在這個示例中有個問題沒解決,那就是滾動條的操作,當編輯框移動到可視范圍之外時,需要手動操作滾動條才能讓編輯框顯示。但是DataGridView不提供操作滾動條的方法,其他帶滾動條的控件也不提供操作滾動條的方法。不知有沒有哪位大俠知道方法?

      代碼下載:https://files.cnblogs.com/conexpress/TestDataGridViewColumnHeaderEditor.zip

      posted @ 2009-03-06 10:37  Alex Leo  閱讀(5549)  評論(5)    收藏  舉報
      主站蜘蛛池模板: 国产免费人成网站在线播放 | 日韩免费码中文在线观看| 国产精品一区在线蜜臀| 无码人妻一区二区三区精品视频| 99国产精品一区二区蜜臀| 久久精品国产亚洲av天海翼| 日本不卡片一区二区三区| 麻豆一区二区中文字幕| 日本在线 | 中文| 成人免费乱码大片a毛片| 国产丰满麻豆videossexhd| 亚洲性图日本一区二区三区| 欧美激情一区二区三区成人| 久久久午夜精品福利内容 | 中文字幕av无码免费一区| 国产精品户外野外| 色橹橹欧美在线观看视频高清| 亚洲丶国产丶欧美一区二区三区 | 正在播放的国产A一片| 时尚| 国产一区二区日韩在线| 国产精品久久久尹人香蕉| 91福利国产午夜亚洲精品| 欧美va亚洲va在线观看| 无码国产偷倩在线播放老年人 | 国产色婷婷精品综合在线 | 欧美熟妇性XXXX欧美熟人多毛| 精品久久精品久久精品九九| 精品久久久久久无码国产| 老司机性色福利精品视频| 黄瓜视频在线观看| 精品日本乱一区二区三区| 狠狠色综合久久狠狠色综合 | 孝感市| bt天堂新版中文在线| 国产麻豆精品手机在线观看| 久久久久亚洲AV成人片一区| 亚洲国产性夜夜综合| 顶级欧美熟妇xx| 亚洲精品一二三伦理中文| 久久这里有精品国产电影网|