欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

C# 重写ComboBox实现下拉任意组件的方法

程序员文章站 2022-03-26 08:37:20
一、需求 c#种的下拉框combobox不支持下拉复选框列表与下拉树形列表等,系统中需要用到的地方使用了第三方组件,现在需要将第三方组件替换掉。 二、设计 基本思路:...

一、需求

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

以上所述是小编给大家介绍的c# 重写combobox实现下拉任意组件的方法,希望对大家有所帮助