1. 程式人生 > >winform combobox控制元件實現多選

winform combobox控制元件實現多選

幫同事做個winform展示程式需要用到combobox多選,今天才發現沒有這功能,只能到網上找解決方法,都是自己擴充套件了控制元件,就找一份研究了下,自己參考著擴充套件一下,瞭解了原理,現在記下來。 描述:現有的combobox只有單選功能,通過重畫combobox構造多選combobox; 理論:1、重畫combobox:設定是否多選屬性IsMultiple,當屬性值為true時,重畫combobox,重寫之前的滑鼠點選事件,將下拉列表永久隱藏,並新增CheckedListBox控制元件並定位到combobx控制元件的下部;2、事件的重寫:對checkedListBox控制元件增加因子選中事件ItemCheck並將其繫結到combobox的Itemcheck事件,實現選中時值的獲取並繫結checkedListBox的滑鼠事件MouseUp實現combobox文字內容的展示 3、combobox屬性的修改:selectedValues屬性的獲取選中值;SelectedItems作為combobox新增屬性,返回選中項 4、定位checkListBox::獲取combobox的x座標作為checkListBox的x座標,通過獲取此控制元件的父級以上所有空間的x座標相加即可。同理y座標相似,但是最後需要加上combobox的高度 實現: 1、新建類:ComboBoxMul,繼承ComboBox類。 2、在類中增加屬性:_IsMultiSelect(私有屬性)、IsMultiSelect(公用)(是否多選,若多選重畫控制元件,否則不用),Values(以鍵值對形式儲存選中值) 重畫控制元件:a)在類中新增成員CheckedListBox物件,初始化Values屬性; b)設定ComboBox的DrawMode設定為OwnerDrawFixed,使其能重畫控制元件,同時設定IntegralHeight設為false以使控制元件不自動調整大小,DoubleBuffered設為true以使用緩衝區進行重畫控制元件防止閃爍,DroppedDown設為false以設定不顯示下拉部分,DropDownHeight設為1以設定下拉框高度為1px,DropDownStyle:設為ComboBoxStyle.DropDown以設定文字部分可編輯; c)設定CheckedListBox控制元件屬性,CheckOnClick設為true以設定點中即選中,同時繫結因子項點選事件ItemCheck,滑鼠釋放事件MouseUp,滑鼠移出事件MouseLeave,同時設定屬性BorderStyle為BorderStyle.Fixed3D,並設定Visible為false使其隱藏 d)繫結CheckedListBox的因子項點選事件到ComboBox 3、過載ComboBox滑鼠點選及滑鼠釋放事件,若為多選,對於ComboBox的使其不下拉。同時過載下拉事件,多選時,設定CheckedListBox顯示,設定因子項高度、邊框及尺寸,之後通過System.Drawing.Point將其定位到ComboBox下端。而後開始繪製CheckedListBox,設定展示項,值項及資料來源(繪製過程中使用BeginUpdate()及EndUpdate()防止在賦值過程中控制元件繪圖影響效能),構造完CheckedListBox後將其置入父級控制元件 a)在構建過程中需要定位Combobox位置,Combobox的座標為各級座標和 b)構建CheckedListBox的尺寸,寬度:combobox下拉框的寬度,高度:combobox下拉最大下拉項*項高+下拉項高/2 4、CheckedListBox事件:滑鼠釋放事件lst_MouseUp(多選時,觸發後設置combobox文字框內容),因子項點選事件lst_ItemCheck(點選後獲取值),滑鼠移出事件lst_MouseLeave(移開CheckedListBox隱藏此控制元件)