65.9K
CodeProject 正在变化。 阅读更多。
Home

可自定义的 ComboBox 下拉列表

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.54/5 (57投票s)

2008年4月22日

MIT

3分钟阅读

viewsIcon

368408

downloadIcon

20427

一个具有可自定义下拉列表的组合框控件。

Sample Image

引言

本文介绍了一个 .NET ComboBox 的扩展,它提供了自定义的下拉菜单。该控件可以自动在下拉菜单的底部添加一个调整大小的控件。

设计

可以使用 .NET ToolStripDropDownToolStripControlHost 类来实现自定义下拉菜单功能。这两个类非常有用,因为它们可以防止应用程序窗体在下拉菜单显示期间变为非活动状态。 此控件所需的自定义弹出功能已封装在 PopupControl 类中(自原始文章发布以来新增的功能)。

除了简化此控件外,PopupControl 类还可用于在您自己的控件中提供下拉菜单支持。 PopupControl 还集成了下拉菜单大小调整支持(现在无需嵌套可调整大小的容器,详见下文)。

以前,下拉菜单控件通过嵌套可调整大小的容器来调整大小。 这是一个可以接受的解决方案(因为它有效),但它在大小调整操作期间导致了一些重绘错误。 现在,大小调整功能已得到显着改进,并且现在还可以定义下拉菜单的哪些边可以调整大小(如果有)。 现在也可以通过拖动下拉菜单的可调整大小的边缘来调整大小。 新的大小调整功能是通过拦截 Win32 命中测试消息,并根据设置的 PopupResizeMode 属性做出适当的响应来实现的。

以下 UML 类图提供了所介绍类的概述

CustomDDComboBox/uml-overview.png

Using the Code

与大多数控件一样,此控件可以在运行时动态创建,也可以使用 Visual C# IDE 设计器的拖放功能创建。 在运行时,必须将 DropDownControl 属性分配给另一个控件的实例。 分配的控件**不能**包含在其他位置,因为这**会**导致问题。

删除边框后,大多数下拉菜单控件看起来会更好。

namespace CustomComboDemo
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            // Dynamically created controls.

            // Create grid view control.
            DataGridView gridView = new DataGridView();
            gridView.BorderStyle = BorderStyle.None;
            gridView.Columns.Add("Column1", "Column 1");
            gridView.Columns.Add("Column2", "Column 2");
            gridView.Columns.Add("Column3", "Column 3");
            gridView.Columns.Add("Column4", "Column 4");
            gridView.Columns.Add("Column5", "Column 5");
            this.customComboBox1.DropDownControl = gridView;

            // Create user control.
            UserControl1 userControl = new UserControl1();
            userControl.BorderStyle = BorderStyle.None;
            this.customComboBox2.DropDownControl = userControl;

            // Create rich textbox control.
            RichTextBox richTextBox = new RichTextBox();
            richTextBox.BorderStyle = BorderStyle.None;
            this.customComboBox3.DropDownControl = richTextBox;
        }
    }
}

关注点

在编写代码时,我发现下拉菜单控件没有立即检索到输入焦点。 出现此问题的原因是,即使在 Win32 消息处理程序中忽略了下拉菜单代码,标准的 win32 下拉菜单仍然会出现(1x1 像素)。 为了避免这种情况,创建了一个计时器,该计时器强制下拉菜单控件在默认的 win32 下拉菜单获得焦点后获得焦点。 计时器完成其工作后,它会禁用自身。

历史

  • 2008 年 4 月 22 日:发布原始版本
  • 2008 年 4 月 29 日:更新了下载文件
    • 修复了 Adam Hearn 指出的一个错误
  • 2008 年 6 月 17 日:各种更改
    • 改进的设计
    • 下拉菜单大小调整期间的奇怪绘图效果现已得到显着改进
    • 添加了 PopupControl 以提供通用的自定义下拉菜单支持
    • 添加了下载文件:版本 2
  • 2008 年 6 月 28 日:更新了版本 2 的下载文件
  • 2008 年 7 月 15 日:更新至 2.1 版本。
    • 非常感谢成员“Leon v Wyk”的更新
    • 改进的版本现在隐藏了 Visual Studio .IDE 属性面板中不兼容的属性,这造成了混淆
  • 2009 年 6 月 21 日:更新至版本 2.2
    • 更新了源代码、演示项目和 UML 概览图
    • 修复了 CodeProject 成员“dokmanov”发现的错误
      虽然在使用下拉箭头关闭下拉菜单时触发了“DropDownClosed”事件,但在通过单击窗体区域关闭下拉菜单时,该事件未被触发
© . All rights reserved.