C#编程之C# 重写ComboBox实现下拉任意组件
小标 2019-03-13 来源 : 阅读 1520 评论 0

摘要:本文主要向大家介绍了C#编程之C# 重写ComboBox实现下拉任意组件,通过具体的内容向大家展示,希望对大家学习C#编程有所帮助。

本文主要向大家介绍了C#编程之C# 重写ComboBox实现下拉任意组件,通过具体的内容向大家展示,希望对大家学习C#编程有所帮助。

C#编程之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
Demo下载:
//files.cnblogs.com/files/peifei/HsComboBoxDemo.rar

本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标编程语言C#.NET频道!

本文由 @小标 发布于职坐标。未经许可,禁止转载。
喜欢 | 0 不喜欢 | 0
看完这篇文章有何感觉?已经有0人表态,0%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程