重写COMBOXEDIT
一、需求
C#种的下拉框ComboBox不支持下拉复选框列表与下拉树形列表等,系统中需要用到的地方使用了第三方组件,现在需要将第三方组件替换掉。
二、设计
基本思路:重写ComboBox,将原生的下拉部分屏蔽,使用toolStripDropDown制作下拉弹出
三、问题解决
1. 问题:toolStripDropDown中放toolStripControlHost时会有边框产生,同时CheckedListBox的duck为full时底端会有很大空白
解决:
1
2
3
4
5
|
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实现下拉任意组件的方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!
重写COMBOXEDIT的更多相关文章
- .NET 基础 一步步 一幕幕[面向对象之方法、方法的重载、方法的重写、方法的递归]
方法.方法的重载.方法的重写.方法的递归 方法: 将一堆代码进行重用的一种机制. 语法: [访问修饰符] 返回类型 <方法名>(参数列表){ 方法主体: } 返回值类型:如果不需要写返回值 ...
- category中重写方法?
问:可以在category中重写方法吗? 答:代码上可以实现 在category中重写方法,但在实际开发中,不建议这样做.如果确实需要重写原有方法也建议使用子类进行重写. category是为了更方便 ...
- ASP.NET Aries 4.0 开源发布:已完成基础功能优化重写
主要更新: 1:增加AR.Global.GetUser() 方法返回当前登陆者的用户信息. 2:重写AR.Combobox 支持下拉树. 3:调整及扩展Input下拉的配置参数. 4:优化及新增AR. ...
- 小丁带你走进git的世界四-重写历史记录
一.git对象文件创建 开篇先补充一个知识点,就是比如我建立一个文件之后,使用git add就会生成一个git对象,但是git对象生成后可以在.git/objects里面对应,首先我们来初始化一个仓库 ...
- 已经重写,源码和文章请跳转http://www.cnblogs.com/ymnets/p/5621706.html
文章由于写得比较仓促 已经重写,源码和文章请跳转 http://www.cnblogs.com/ymnets/p/5621706.html 系列目录 前言: 导入导出实在多例子,很多成熟的组建都分装了 ...
- C#基础回顾(二)—页面值传递、重载与重写、类与结构体、装箱与拆箱
一.前言 -孤独的路上有梦想作伴,乘风破浪- 二.页面值传递 (1)C#各页面之间可以进行数据的交换和传递,页面之间可根据获取的数据,进行各自的操作(跳转.计算等操作).为了实现多种方式的数据传递,C ...
- SQL Server索引视图以(物化视图)及索引视图与查询重写
本位出处:http://www.cnblogs.com/wy123/p/6041122.html 经常听Oracle的同学说起来物化视图,物化视图的作用之一就是可以实现查询重写,听起来有一种高大上的感 ...
- Nginx 反向代理、负载均衡、页面缓存、URL重写及读写分离详解
转载:http://freeloda.blog.51cto.com/2033581/1288553 大纲 一.前言 二.环境准备 三.安装与配置Nginx 四.Nginx之反向代理 五.Nginx之负 ...
- Storm中遇到的日志多次重写问题(一)
业务描述: 统计从kafka spout中读取的数据条数,以及写入redis的数据的条数,写入hdfs的数据条数,写入kafaka的数据条数.并且每过5秒将数据按照json文件的形式写入日志.其中保存 ...
随机推荐
- Python3.4 枚举类型的使用
From: https://majing.io/posts/10000005131196 枚举类型是在Python3.4新增到Python的标准库. 创建枚举 Python提供了两种方法来创建枚举: ...
- [蓝桥杯]PREV-25.历届试题_城市建设
问题描述 栋栋居住在一个繁华的C市中,然而,这个城市的道路大都年久失修.市长准备重新修一些路以方便市民,于是找到了栋栋,希望栋栋能帮助他. C市中有n个比较重要的地点,市长希望这些地点重点被考虑.现在 ...
- 从零开始编译Poco C++和VS2015环境配置
Poco C++是一个C++的开源框架,详细介绍可以问百度介绍更详细,这里我就记录下我从零编译poco-1.9.0和配置 VS2015的环境,以备不时之需. 步骤:一.安装cmake: 二.编译poc ...
- 尝试 Markdown 写测试用例
我的原帖https://testerhome.com/topics/9412 大家都知道我们社区的帖子提倡用Markdown格式编写,正好项目进入稳定期,尝试用Markdown写下测试用例.有几个目的 ...
- URLConnection(互联网)
一.urlconnection连接Servlet 1:> URL请求的类别: 分为二类,GET与POST请求.二者的区别在于: ...
- scrapy实战之scrapyrt的使用
scrapyrt为scrapy提供了一个http接口,有了它,我们不用再执行命令,而是直接请求一个http接口来启动项目,如果项目是部署在远程的,会比较方便. 1.安装: pip install sc ...
- openj9
下面部分转自:https://www.jianshu.com/p/916b5fcd0140 OpenJ9,OMR与OpenJDK Eclipse OpenJ9 是一个 Java 虚拟机(JVM) ...
- node vue
官网 ECMAScript 6 Node.Js WebPack Vue.js Vuex Vue-loader (类比css-loader,是webpack中用于处理.vue文件的) vue-route ...
- JAVA图片验证码(转自“云在青山”)
首先创建一个生成图片的类,设置一些请求参数,生成随机的字符串,然后字符串传给生成验证码图片的类进行处理,完成后输出到页面 1.创建验证码生成类 package hh.com.util; import ...
- js Base64 转化成图片格式
function dataURLtoFile(dataurl, filename = 'file') { let arr = dataurl.split(',') let mime = arr[0]. ...