【问题标题】:Hide DropDownList in ComboBox在组合框中隐藏下拉列表
【发布时间】:2011-10-24 01:56:51
【问题描述】:

如何在 ComboBox 中隐藏 DropDownList?

我只想使用 ComboBox 来显示文本。
这个控件看起来不错,对我来说比 TextBox 加按钮更好。
所以必须启用控件,但没有任何项目。
当用户单击箭头(或 alt + 向下键)时,DropDownList 不应该显示,因为从自定义 DataGridView 中选择值以填充 ComboBox 中的文本。

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

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

【问题讨论】:

  • 我认为创建一个带有文本框和按钮的用户控件会更好。然后添加要显示的文本的属性,以及单击按钮时的公共事件。
  • 哪个 UI 框架?表格? WPF? ASP.NET 网络表单?银光?
  • 听起来你需要一个只读文本框。
  • @WraithNath:正如我所说,我可以通过 TextBox 加 Button 来完成,但对我来说这不是答案。
  • @Revelvice - 好的,我知道你不想使用文本框,但是使用 ComboBox 不容易实现 - 你必须超越控件并覆盖各种事件,可能还有绘画如果可能的话,停止列表显示的事件

标签: c# .net winforms combobox drop-down-menu


【解决方案1】:

您可以在子类中拦截导致框下拉的消息。下面的 sn-p 定义了一个控件 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;
        }
    }
}

【讨论】:

  • 是的!谢谢!这正是我需要的。 :) 现在我将简单地添加事件来控制以处理点击和瞧。
  • F4 也在打开组合框下拉列表。
  • @Edwin Groenendaal,不错的解决方案,但如何启用组合框?
【解决方案2】:

您只需创建一个用户控件,其中包含一个文本框和按您想要的样式设置的按钮,就可以减少麻烦并创建更好的最终结果。如果您想出一种方法来删除组合框的功能,那么您真正要做的就是创建不必要的复杂性。

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      [更新]

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

      我从未尝试过,但也许您可以将 MaxDropDownItems 设置为 0。

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

      [编辑]

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

      【讨论】:

      • ComboBox 没有 ReadOnly 属性。
      • 用另一种技术更新。基本上,您要求的不是 cookie 切割器,因此您将不得不强制控件执行您需要的操作。
      • 我无法禁用控制。 MaxDropDownItems 的最小值为 1,在这种情况下什么也不做。关于 DropDownHeight 我写在我的帖子(替代解决方案)。
      【解决方案5】:

      如果 DropDownStyle 设置为 DropDown 并且 Text 设置为 "Something" 那么您的 ComboBox在用户点击按钮时不会下拉。

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

      【讨论】:

      • 即使样式是 DropDown 并设置了 Text,下拉列表仍然会打开。
      猜你喜欢
      • 1970-01-01
      • 2012-08-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多