在组合框中隐藏下拉列表

本文关键字:隐藏 下拉列表 组合 | 更新日期: 2023-09-27 18:05:11

如何在组合框中隐藏下拉列表?

我想使用ComboBox只显示文本。
这个控件看起来不错,对我来说比文本框加按钮要好。
所以control必须被启用,但是没有任何项。
当用户点击箭头键(或alt + down键)时,下拉列表不应该显示,因为我将选择自定义DataGridView中的值,以便在组合框中填充文本。

编辑。另一种解决方案是将DropDownHeight设置为1,点击控件后只显示1个像素线。

编辑。真正的解决方案。回答下面的

在组合框中隐藏下拉列表

您可以在子类中拦截导致该框下拉的消息。下面的代码片段定义了一个控件NoDropDownBox,它忽略鼠标单击导致组合框的下拉:

public class NoDropDownBox : ComboBox
{
    public override bool PreProcessMessage(ref Message msg)
    {
        int WM_SYSKEYDOWN = 0x104;
        bool handled = false;
        if (msg.Msg == WM_SYSKEYDOWN)
        {
            Keys keyCode = (Keys)msg.WParam & Keys.KeyCode;
            switch (keyCode)
            {
                case Keys.Down:
                    handled = true;
                    break;
            }
        }
        if(false==handled)
            handled = base.PreProcessMessage(ref msg);
        return handled;
    }
    protected override void WndProc(ref Message m)
    {            
        switch(m.Msg)
        {
            case 0x201:
            case 0x203:
                break;
            default:
                base.WndProc(ref m);
                break;
        }
    }
}

通过简单地创建一个带有文本框和按钮的用户控件,以您想要的方式样式,您将有更少的麻烦和创建更好的最终结果。如果您找到了一种方法来删除组合框的功能,那么您实际上所做的就是创建不必要的复杂性。

也许最好创建一个自定义控件,并在需要此功能时使用它。如果你正在使用Windows窗体,也许最简单的方法是继承类UserControl并使用可视化设计器编写少量代码来创建组件。你也可以下降ComboBox类和编码自己的绘图逻辑,但它似乎需要更多的工作。

[Updated]

OK,您不能将组合框设置为只读,但可以设置为Enabled = false

我从来没有尝试过,但也许你可以将MaxDropDownItems设置为0。

但是,您仍然可以将组合框的文本设置为您在代码中想要的值。

[编辑]

另一个想法:设置DropDownHeight为0(…)如果不接受0,则为1)。

如果DropDownStyle被设置为DropDown并且Text被设置为"Something"那么当用户点击按钮时,ComboBox将不会下拉。

至少,我在WinForms (c# 4.0)中得到了这种行为。这就是你想要达到的目标吗?