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

一、需求

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实现下拉任意组件的方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索c
, combobox
重写
c站、c语言、cf、ch、c罗,以便于您获取更多的相关知识。

时间: 2024-09-09 21:07:08

C# 重写ComboBox实现下拉任意组件的方法_C#教程的相关文章

重写、隐藏基类(new, override)的方法_C#教程

复制代码 代码如下: public class Father    {        public void Write() {            Console.WriteLine("父");        }    }     public class Mother    {        public virtual void Write()        {            Console.WriteLine("母");        }    }

Android打造通用的下拉刷新组件

还记得上一篇 blog 的内容吗?如果不记得建议先去了解一下,Android 事件处理全面剖析 ,因为下拉刷新需要用到手势的处理,而上一篇文章中,对事件处理做了很详细的说明,了解了事件的处理机制,对理解本篇文章有很大的帮助.好了,这里就当大家都已经对事件处理有了一定的了解,开始我们的下拉刷新征程. 还是老规矩,先上效果图,再根据效果图来分析实现的原理:  一 .分析原理  我们都知道,listView 控件为我们提供了 addHeaderView.和 addFootView 的方法,我们通过此方

Jquery Easyui自定义下拉框组件使用详解(21)_jquery

本文实例为大家分享了Jquery Easyui自定义下拉框组件的实现代码,供大家参考,具体内容如下 加载方式 JS调用加载 自定义下拉框不能通过标签的方式进行创建. <input id="box" /> <script> $(function () { //JS 加载调用 $('#box').combo({ required : true, multiple : true, }); }); </script> 属性列表 <script>

jQuery Easyui 下拉树组件combotree_jquery

jQuery EasyUI 组合树(ComboTree) 和组合框的用法差不多,只是在显示上有点差别:一个显示成树状结构,一个显示成列表结构. 项目中做角色授权时,需要做一个下拉框带树结构的 并且可以多选的组件,就想到了easyui的combotree,有关这个组件的用法废话不多说,直接上代码 $('#bianhao').combotree({ url : urlg2 + '/tbdefaultroll/selectByLevel?belongLevel=' + $('#jibie').comb

Excel中任意多级下拉菜单的制作方法

  Excel中任意多级下拉菜单的制作方法 是不是有点不敢相信,也许在想,即使能实现,肯定也会是非常非常的复杂.兰色告诉你,二级和二级以上的制作方法都是相同的原理,即使你EXCEL水平很菜,看完下面的教程,照样可以做出来. 一.1级下拉菜单 制作一级下拉菜单很简单,选取要设置的区域,数据 - 有效性 - 选取数据源. 二.2级下拉菜单 1 .在C和D列分别添加公式. C3公式:=MATCH(B3,A:A,0)-1 D3公式:=COUNTIF(A:A,B3) 2 .在下面A和B列设置二级的对应明细

jQuery+easyui中的combobox实现下拉框特效

 这篇文章主要介绍了jQuery+easyui中的combobox实现下拉框特效的几种方法,非常简单实用,需要的朋友可以参考下     1.第一种写法:Input框中显示:   代码如下: <input id="cc" class="easyui-combobox" name="name" data-options="valueField:'value',textField:'text',data:[{'value':'1','t

combobox-在EXT的可编辑表格里加入一个comboBox,但是下拉框选项一直处于加载中状态

问题描述 在EXT的可编辑表格里加入一个comboBox,但是下拉框选项一直处于加载中状态 comboBox是从本地取得数据,渲染函数我也写了.就是其选择一直加载不出来,但是点击的时候可以选择第一个选项.但是还是处于加载中状态 解决方案 怎么办 解决方案二: 代码发来看下?本地数据(配置data)不会出现加载状态才对

combobox-C#vs2010中comboBox的下拉框如何隐藏

问题描述 C#vs2010中comboBox的下拉框如何隐藏 如图,如何让comboBox下面的下拉框一直不显示? 解决方案 一直不显示就用文本框算了,自绘一个假的箭头唬下人. 也许你要的根本不是comboBox,而是带AutoComplete的TextBox 解决方案二: 你要的是设置DropDownStyle属性?

combo box-Qt5 中窗口全屏状态下,ComboBox的下拉框无法显示?以及文本输入框输入文字时无法切换输入法?

问题描述 Qt5 中窗口全屏状态下,ComboBox的下拉框无法显示?以及文本输入框输入文字时无法切换输入法? 主要是全屏状态下时会出问题! Qt5 中窗口全屏状态下,ComboBox的下拉框点击后无法显示,但仍然可以选中!以及文本输入框输入文字时无法切换输入法!!该怎么解决!!求大神 解决方案 http://www.oschina.net/question/2001267_194321 解决方案二: 有没有大神可以解决下啊,或者可以提供一些思路啊!! 解决方案三: 好像是由于父窗口中存在qml