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隐藏此控件)

猜你喜欢

转载自blog.csdn.net/kuangdang178/article/details/46007311