C# 重寫ComboBox實(shí)現(xiàn)下拉任意組件的方法
一、需求
C#種的下拉框ComboBox不支持下拉復(fù)選框列表與下拉樹形列表等,系統(tǒng)中需要用到的地方使用了第三方組件,現(xiàn)在需要將第三方組件替換掉。
二、設(shè)計(jì)
基本思路:重寫ComboBox,將原生的下拉部分屏蔽,使用toolStripDropDown制作下拉彈出
三、問題解決
1. 問題:toolStripDropDown中放toolStripControlHost時會有邊框產(chǎn)生,同時CheckedListBox的duck為full時底端會有很大空白
解決:
toolStripControlHost.Margin = Padding.Empty; toolStripControlHost.Padding = Padding.Empty; toolStripControlHost.AutoSize = false; toolStripDropDown.Padding = Padding.Empty; CheckedListBox設(shè)置屬性IntergralHeight為false
2. 問題:BorderStyle對于不同組件的顯示效果不同,下拉部分邊緣顯示效果不好
解決:將組件BorderStyle統(tǒng)一設(shè)為None,再放入panel中,Panel重繪邊線與背景后加入toolStripControlHost
3. 問題:下拉部分需要實(shí)現(xiàn)可拖動大小
解決:通過MouseDown、MouseLeave、MouseMove三個事件配合Cusor的位置來實(shí)現(xiàn)鼠標(biāo)拖動改變組件大小,設(shè)置Label文字內(nèi)容為"◢"作為拖動的指示
4. 問題:拖動時組件閃爍嚴(yán)重
解決:使用雙緩存,重寫ToolStripDropDown中的CreateParams,設(shè)置cp.ExStyle |= 0x02000000;//雙緩存
5. 問題:下拉焦點(diǎn)問題,點(diǎn)擊下拉后下拉部分沒有獲取焦點(diǎn),導(dǎo)致右下角拖放標(biāo)志捕捉不到鼠標(biāo)
解決:ComboBox在事件OnDropDown之后可能還會進(jìn)行某些操作導(dǎo)致再次獲取焦點(diǎn),所以要將設(shè)置下拉部分焦點(diǎn)的動作寫在OnMouseClick的事件中
6. 問題: ComboBox的文本輸入問題
解決:當(dāng)DropDownStyle為DropDown時,ComboBox可輸入,這是不太合適的,但是無法設(shè)置不能輸入。
當(dāng)DropDownStyle為DropDownList時,可以實(shí)現(xiàn)不能手動輸入,但是不能直接對Text賦值,需要New一個Item再將Item的值選中實(shí)現(xiàn)Text顯示
7. 問題: ComboBox的下拉部分隱藏
解決:當(dāng)需要隱藏原生下拉部分時,設(shè)置DropDownHeight=1即可
8. 問題: 下拉部分存在時點(diǎn)擊下拉框,關(guān)閉下拉
解決:由于toolStripDropDown的關(guān)閉事件在ComboBox的點(diǎn)擊事件之前,所以不能通過toolStripDropDown的狀態(tài)來設(shè)計(jì)。
我的方法是,設(shè)置一個全局變量isCursorOnComboBox,用于判斷關(guān)閉下拉部分時光標(biāo)是否在comboBox上。在toolStripDropDown的Closed事件中改變這個值,在點(diǎn)擊下拉事件中根據(jù)這個值來決定是否要生成下拉部分。
9. 問題: 當(dāng)不生成下拉部分,沒有失去焦點(diǎn)時,ComboBox點(diǎn)擊一次后處于下拉狀態(tài),需要再點(diǎn)擊一次才恢復(fù)正常
解決:通過模擬鍵盤輸入Enter鍵強(qiáng)行恢復(fù)
10.問題: CheckedListBox選中后顯示選中Items的內(nèi)容
解決:主要問題在事件的選擇上,如果寫在selected等事件中時,與復(fù)選框的選擇有出入,不適合(如雙擊等),寫在ItemCheck事件上時發(fā)現(xiàn)是在選中前,導(dǎo)致正在選的Item值判斷延遲。
所以最好選擇與Check直接掛鉤的ItemCheck事件,同時對正在Check的Item進(jìn)行特殊處理,使用異或(!=)運(yùn)算。
11.問題: 兼容性,其他組件的下拉支持
解決:在TypeC中添加Other條目,當(dāng)下拉類型為Other時,設(shè)置DropDown內(nèi)容為普通Control,調(diào)用方可以通過設(shè)置SetDropDown(Control)來設(shè)置要顯示的組件內(nèi)容。
12.問題: 下拉面板顏色在Windows不同主題下顯示問題
解決:由于在Windows的經(jīng)典模式下,使用Sytem.XXX 調(diào)用不到顏色,導(dǎo)致下拉框顏色顯示不出。
繪制時使用Color.XXX中的顏色,在不同系統(tǒng)模式下顯示都正常。
四、使用方法
1. 放下拉復(fù)選列表
① 界面拖出HsComboBox
② 設(shè)置屬性CtlType = CheckedListBox
③ (可選)代碼調(diào)用hsComboBox.SetDropDown(CheckedListBox)重新設(shè)置內(nèi)容
④ 代碼調(diào)用hsComboBox. CheckedListBox可獲取組件
2. 放下拉樹形
⑤ 界面拖出HsComboBox
⑥ 設(shè)置屬性CtlType = TreeView
⑦ (可選)代碼調(diào)用hsComboBox.SetDropDown(TreeView)重新設(shè)置內(nèi)容
⑧ 代碼調(diào)用hsComboBox. TreeView可獲取組件
3. 做普通ComboBox
⑨ 界面拖出HsComboBox
⑩ 設(shè)置屬性CtlType = Null
4. 放任意Control
? 界面拖出HsComboBox
? 設(shè)置屬性CtlType = Other
? 代碼調(diào)用hsComboBox.SetDropDown(Control)放入內(nèi)容
? 代碼調(diào)用hsComboBox.Control可獲取組件
五、注意要點(diǎn)
1. ComboBox的Text設(shè)置
調(diào)用函數(shù)ShowText()設(shè)置Text內(nèi)容,可用于自定義組件的事件等
2. DropDownStyle
為禁止文本手工輸入,DropDownStyle將在構(gòu)造函數(shù)中設(shè)為DropDownList
以上所述是小編給大家介紹的C# 重寫ComboBox實(shí)現(xiàn)下拉任意組件的方法,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
- 詳解C#用new和override來實(shí)現(xiàn)抽象類的重寫區(qū)別
- C#重寫DataGridView
- 在C#的類或結(jié)構(gòu)中重寫ToString方法的用法簡介
- C#通過重寫Panel改變邊框顏色與寬度的方法
- c#方法重寫和隱藏的學(xué)習(xí)示例
- c#重寫TabControl控件實(shí)現(xiàn)關(guān)閉按鈕的方法
- C#中重載與重寫區(qū)別分析
- C#運(yùn)算符重載用法實(shí)例分析
- C#中重載相等(==)運(yùn)算符示例
- C#中多態(tài)、重載、重寫區(qū)別分析
- C#重載運(yùn)算符詳解
- 基于C#方法重載的總結(jié)詳解
- c# 重載WndProc,實(shí)現(xiàn)重寫“最小化”的實(shí)現(xiàn)方法
- C#中重載重寫和覆蓋的定義與區(qū)別
相關(guān)文章
C# 刪除數(shù)組內(nèi)的某個值、一組值方法詳解
在本篇文章里小編給大家整理的是關(guān)于C# 如何刪除數(shù)組內(nèi)的某個值、一組值的相關(guān)知識點(diǎn),需要的朋友們學(xué)習(xí)下。2020-03-03C#類型轉(zhuǎn)換之自定義隱式轉(zhuǎn)換和顯式轉(zhuǎn)換
本文主要為大家介紹了一個新的類型轉(zhuǎn)換方法:通過自定義隱式轉(zhuǎn)換,把不一樣的數(shù)據(jù)類型反序列化為一樣的數(shù)據(jù)類型,需要的同學(xué)可以參考一下2022-03-03C#獲取真實(shí)IP地址實(shí)現(xiàn)方法
這篇文章主要介紹了C#獲取真實(shí)IP地址實(shí)現(xiàn)方法,對比了C#獲取IP地址的常用方法并實(shí)例展示了C#獲取真實(shí)IP地址的方法,非常具有實(shí)用價值,需要的朋友可以參考下2014-10-10C#將Sql數(shù)據(jù)保存到Excel文件中的方法
這篇文章主要介紹了C#將Sql數(shù)據(jù)保存到Excel文件中的方法,文中的ExportExcel可起到將sql數(shù)據(jù)導(dǎo)出為Excel的作用,需要的朋友可以參考下2014-08-08C#操作NPOI實(shí)現(xiàn)Excel數(shù)據(jù)導(dǎo)入導(dǎo)出
這篇文章主要為大家詳細(xì)介紹了C#如何操作NPOI實(shí)現(xiàn)Excel數(shù)據(jù)導(dǎo)入導(dǎo)出功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-02-02C#使用NPOI操作Excel工具類的實(shí)現(xiàn)
NPOI是POI項(xiàng)目的.NET遷移版本,使用NPOI可以在沒有安裝Office或者相應(yīng)環(huán)境的機(jī)器上對Word或Excel文檔進(jìn)行讀寫操作,下面我們就來學(xué)習(xí)一下如何使用NPOI編寫操作Excel的工具類吧2023-11-11深入解析C#設(shè)計(jì)模式編程中對建造者模式的運(yùn)用
這篇文章主要介紹了C#設(shè)計(jì)模式編程中對建造者模式的運(yùn)用,文中還介紹了在.NET框架下建造者模式編寫思路的實(shí)現(xiàn),需要的朋友可以參考下2016-02-02