C# 重寫ComboBox實現下拉任意組件

來源:互聯網
上載者:User

標籤:需要   改變   類型   添加   ram   type   color   內容   自訂   

一、需求

C#種的下拉框ComboBox不支援下拉複選框列表與下拉樹形列表等,系統中需要用到的地方使用了第三方組件,現在需要將第三方組件替換掉。

二、設計

基本思路:重寫ComboBox,將原生的下拉部分屏蔽,使用toolStripDropDown製作下拉彈出

三、問題解決1.     問題:toolStripDropDown中放toolStripControlHost時會有邊框產生,同時CheckedListBox的duck為full時底端會有很大空白

 

解決:

toolStripControlHost.Margin = Padding.Empty;

toolStripControlHost.Padding = Padding.Empty;

toolStripControlHost.AutoSize = false;

toolStripDropDown.Padding = Padding.Empty;

CheckedListBox設定屬性IntergralHeight為false

2.     問題:BorderStyle對於不同組件的顯示效果不同,下拉部分邊緣顯示效果不好

 

解決:將組件BorderStyle統一設為None,再放入panel中,Panel重繪邊線與背景後加入toolStripControlHost

3.     問題:下拉部分需要實現可拖動大小

         解決:通過MouseDown、MouseLeave、MouseMove三個事件配合Cusor的位置來實現滑鼠拖動改變組件大小,設定Label文字內容為"◢"作為拖動的指示

4.     問題:拖動時組件閃爍嚴重

         解決:使用雙緩衝,重寫ToolStripDropDown中的CreateParams,設定cp.ExStyle |= 0x02000000;//雙緩衝

5.     問題:下拉焦點問題,點擊下拉後下拉部分沒有擷取焦點,導致右下角拖放標誌捕捉不到滑鼠

解決:ComboBox在事件OnDropDown之後可能還會進行某些操作導致再次擷取焦點,所以要將設定下拉部分焦點的動作寫在OnMouseClick的事件中

6.     問題: ComboBox的文本輸入問題

解決:當DropDownStyle為DropDown時,ComboBox可輸入,這是不太合適的,但是無法設定不能輸入。

當DropDownStyle為DropDownList時,可以實現不能手動輸入,但是不能直接對Text賦值,需要New一個Item再將Item的值選中實現Text顯示

7.     問題: ComboBox的下拉部分隱藏

解決:當需要隱藏原生下拉部分時,設定DropDownHeight=1即可

8.     問題: 下拉部分存在時點擊下拉框,關閉下拉

解決:由於toolStripDropDown的關閉事件在ComboBox的點擊事件之前,所以不能通過toolStripDropDown的狀態來設計。

我的方法是,設定一個全域變數isCursorOnComboBox,用於判斷關閉下拉部分時游標是否在comboBox上。在toolStripDropDown的Closed事件中改變這個值,在點擊下拉事件中根據這個值來決定是否要產生下拉部分。

9.     問題: 當不產生下拉部分,沒有失去焦點時,ComboBox點擊一次後處於下拉狀態,需要再點擊一次才恢複正常

解決:通過類比鍵盤輸入Enter鍵強行恢複

10.問題: CheckedListBox選中後顯示選中Items的內容

解決:主要問題在事件的選擇上,如果寫在selected等事件中時,與複選框的選擇有出入,不適合(如雙擊等),寫在ItemCheck事件上時發現是在選中前,導致正在選的Item值判斷延遲。

所以最好選擇與Check直接掛鈎的ItemCheck事件,同時對正在Check的Item進行特殊處理,使用異或(!=)運算。

11.問題: 相容性,其他組件的下拉支援

解決:在TypeC中添加Other條目,當下拉類型為Other時,設定DropDown內容為普通Control,調用方可以通過設定SetDropDown(Control)來設定要顯示的組件內容。

12.問題: 下拉麵板顏色在Windows不同主題下顯示問題

解決:由於在Windows的傳統模式下,使用Sytem.XXX 調用不到顏色,導致下拉框顏色顯示不出。

繪製時使用Color.XXX中的顏色,在不同系統模式下顯示都正常。

 

四、使用方法1.     放下拉複選列表

①   介面拖出HsComboBox

②   設定屬性CtlType = CheckedListBox

③   (可選)代碼調用hsComboBox.SetDropDown(CheckedListBox)重新設定內容

④   代碼調用hsComboBox. CheckedListBox可擷取組件

2.     放下拉樹形

⑤   介面拖出HsComboBox

⑥   設定屬性CtlType = TreeView

⑦   (可選)代碼調用hsComboBox.SetDropDown(TreeView)重新設定內容

⑧   代碼調用hsComboBox. TreeView可擷取組件

3.     做普通ComboBox

⑨   介面拖出HsComboBox

⑩   設定屬性CtlType = Null

4.     放任意Control

?   介面拖出HsComboBox

?   設定屬性CtlType = Other

?   代碼調用hsComboBox.SetDropDown(Control)放入內容

?   代碼調用hsComboBox.Control可擷取組件

五、注意要點1.     ComboBox的Text設定

調用函數ShowText()設定Text內容,可用於自訂群組件的事件等

2.     DropDownStyle

為禁止文本手工輸入,DropDownStyle將在建構函式中設為DropDownList

Demo下載:

http://files.cnblogs.com/files/peifei/HsComboBoxDemo.rar

C# 重寫ComboBox實現下拉任意組件

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.