一、需求

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的更多相关文章

  1. .NET 基础 一步步 一幕幕[面向对象之方法、方法的重载、方法的重写、方法的递归]

    方法.方法的重载.方法的重写.方法的递归 方法: 将一堆代码进行重用的一种机制. 语法: [访问修饰符] 返回类型 <方法名>(参数列表){ 方法主体: } 返回值类型:如果不需要写返回值 ...

  2. category中重写方法?

    问:可以在category中重写方法吗? 答:代码上可以实现 在category中重写方法,但在实际开发中,不建议这样做.如果确实需要重写原有方法也建议使用子类进行重写. category是为了更方便 ...

  3. ASP.NET Aries 4.0 开源发布:已完成基础功能优化重写

    主要更新: 1:增加AR.Global.GetUser() 方法返回当前登陆者的用户信息. 2:重写AR.Combobox 支持下拉树. 3:调整及扩展Input下拉的配置参数. 4:优化及新增AR. ...

  4. 小丁带你走进git的世界四-重写历史记录

    一.git对象文件创建 开篇先补充一个知识点,就是比如我建立一个文件之后,使用git add就会生成一个git对象,但是git对象生成后可以在.git/objects里面对应,首先我们来初始化一个仓库 ...

  5. 已经重写,源码和文章请跳转http://www.cnblogs.com/ymnets/p/5621706.html

    文章由于写得比较仓促 已经重写,源码和文章请跳转 http://www.cnblogs.com/ymnets/p/5621706.html 系列目录 前言: 导入导出实在多例子,很多成熟的组建都分装了 ...

  6. C#基础回顾(二)—页面值传递、重载与重写、类与结构体、装箱与拆箱

    一.前言 -孤独的路上有梦想作伴,乘风破浪- 二.页面值传递 (1)C#各页面之间可以进行数据的交换和传递,页面之间可根据获取的数据,进行各自的操作(跳转.计算等操作).为了实现多种方式的数据传递,C ...

  7. SQL Server索引视图以(物化视图)及索引视图与查询重写

    本位出处:http://www.cnblogs.com/wy123/p/6041122.html 经常听Oracle的同学说起来物化视图,物化视图的作用之一就是可以实现查询重写,听起来有一种高大上的感 ...

  8. Nginx 反向代理、负载均衡、页面缓存、URL重写及读写分离详解

    转载:http://freeloda.blog.51cto.com/2033581/1288553 大纲 一.前言 二.环境准备 三.安装与配置Nginx 四.Nginx之反向代理 五.Nginx之负 ...

  9. Storm中遇到的日志多次重写问题(一)

    业务描述: 统计从kafka spout中读取的数据条数,以及写入redis的数据的条数,写入hdfs的数据条数,写入kafaka的数据条数.并且每过5秒将数据按照json文件的形式写入日志.其中保存 ...

随机推荐

  1. [蓝桥杯]PREV-22.历届试题_国王的烦恼

    问题描述 C国由n个小岛组成,为了方便小岛之间联络,C国在小岛间建立了m座大桥,每座大桥连接两座小岛.两个小岛间可能存在多座桥连接.然而,由于海水冲刷,有一些大桥面临着不能使用的危险. 如果两个小岛间 ...

  2. 流程帮App风险评估

    一. 存在风险 此处罗列出了我们开发小组可能遇到8种的风险. 编号 风险名称 内容 发生概率 损失(人周) 危险度(周) 1 计划编制风险 对所要使用技术不熟悉,可能导致无法交付: 每个模块的实现一定 ...

  3. Java中的“==操作符”和equals方法有什么区别

    Java中的"=="和equals方法究竟有什么区别? 1.==操作符 "=="操作符专门用来比较两个变量的值是否相等,也就是用于比较变量所对应的内存中所存储的 ...

  4. Win8 & WP8.1 轻型数据库

    自Win8 和 WP8.1 以来,MS把SQL CE去掉了.为了方便自己的APP升级,减少代码改动量,所以写了个小型的数据库管理,参考WP8.1之前的DataContext. 用时较短,花了几天的时间 ...

  5. nil/Nil/NULL/NSNull

    nil/Nil/NULL/NSNull的区别 一个简单的小例子: NSObject *obj = nil; NSLog(@"%@",obj); =>null NSObject ...

  6. mysql免解压版安装教程步骤

    首先我这里演示的是mysql-5.6.27-winx64这个免解压的版本 添加环境变量(如添加了则跳过该步骤) 操作如下: )右键单击我的电脑->属性->高级系统设置(高级)->环境 ...

  7. my first note

    please do not laugh It is very glad to be here, I will study hard.

  8. LSTM编程所用函数

    1.Round函数返回一个数值,该数值是按照指定的小数位数进行四舍五入运算的结果.可是当保留位跟着的即使是5,有可能进位,也有可能舍去,机会各50% 2.python基础 (1)@property 特 ...

  9. JS 数字相加

    var a = 1var b = 2var c = a + b 这样c得出来的解果是12, var c = Number(a)+Number(b) 这样c得出来的解果是3

  10. php laravel加密 form表单认证 laravel分页

    use Illuminate\Support\Facades\Crypt; echo Crypt::encrypt(123); //加密echo "<br>";//解密 ...