服务器之家:专注于服务器技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C# - C# 重写ComboBox实现下拉任意组件的方法

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

2021-12-08 13:16C#教程网 C#

C#种的下拉框ComboBox不支持下拉复选框列表与下拉树形列表等,系统中需要用到的地方使用了第三方组件,现在需要将第三方组件替换掉。这篇文章主要介绍了C# 重写ComboBox实现下拉任意组件的相关资料,需要的朋友可以参考下

一、需求

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

延伸 · 阅读

精彩推荐
  • C#C#设计模式之Strategy策略模式解决007大破密码危机问题示例

    C#设计模式之Strategy策略模式解决007大破密码危机问题示例

    这篇文章主要介绍了C#设计模式之Strategy策略模式解决007大破密码危机问题,简单描述了策略模式的定义并结合加密解密算法实例分析了C#策略模式的具体使用...

    GhostRider10972022-01-21
  • C#SQLite在C#中的安装与操作技巧

    SQLite在C#中的安装与操作技巧

    SQLite,是一款轻型的数据库,用于本地的数据储存。其优点有很多,下面通过本文给大家介绍SQLite在C#中的安装与操作技巧,感兴趣的的朋友参考下吧...

    蓝曈魅11162022-01-20
  • C#三十分钟快速掌握C# 6.0知识点

    三十分钟快速掌握C# 6.0知识点

    这篇文章主要介绍了C# 6.0的相关知识点,文中介绍的非常详细,通过这篇文字可以让大家在三十分钟内快速的掌握C# 6.0,需要的朋友可以参考借鉴,下面来...

    雨夜潇湘8272021-12-28
  • C#VS2012 程序打包部署图文详解

    VS2012 程序打包部署图文详解

    VS2012虽然没有集成打包工具,但它为我们提供了下载的端口,需要我们手动安装一个插件InstallShield。网上有很多第三方的打包工具,但为什么偏要使用微软...

    张信秀7712021-12-15
  • C#C#微信公众号与订阅号接口开发示例代码

    C#微信公众号与订阅号接口开发示例代码

    这篇文章主要介绍了C#微信公众号与订阅号接口开发示例代码,结合实例形式简单分析了C#针对微信接口的调用与处理技巧,需要的朋友可以参考下...

    smartsmile20127762021-11-25
  • C#利用C#实现网络爬虫

    利用C#实现网络爬虫

    这篇文章主要介绍了利用C#实现网络爬虫,完整的介绍了C#实现网络爬虫详细过程,感兴趣的小伙伴们可以参考一下...

    C#教程网11852021-11-16
  • C#深入理解C#的数组

    深入理解C#的数组

    本篇文章主要介绍了C#的数组,数组是一种数据结构,详细的介绍了数组的声明和访问等,有兴趣的可以了解一下。...

    佳园9492021-12-10
  • C#如何使用C#将Tensorflow训练的.pb文件用在生产环境详解

    如何使用C#将Tensorflow训练的.pb文件用在生产环境详解

    这篇文章主要给大家介绍了关于如何使用C#将Tensorflow训练的.pb文件用在生产环境的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴...

    bbird201811792022-03-05