【问题标题】:winforms combobox, how to stop it from dropping down when getting focuswinforms组合框,如何在获得焦点时阻止它下拉
【发布时间】:2015-01-06 22:00:09
【问题描述】:

我在 winform 上有一个组合框,下拉样式设置为 DropDownList。

当用户点击组合框上的任意位置时,它的下拉列表就会打开。 如果我使用任何其他下拉样式(DropDown 或 Simple),情况并非如此,只有当用户单击右侧的箭头时,组合框才会打开。

我需要的是一个组合框,它的 dropdownstyle 设置为 DropDownList 但仍然仅在单击右侧的箭头时才打开其下拉列表,而不是在单击组合框上的其他任何位置时,就像当 dropdownstyle 为 DropDown 或 Simple 时一样.

如果您想知道我为什么想要这个,我将 DrawMode 设置为 OwnerDrawFixed 并在 DrawItem 中绘制组合框,使其看起来很正常,而不是这种 dropdownstyle 强加给我的丑陋 3d。所以我实际上有一个只读组合框,但没有丑陋的 3d 外观。

如果需要,我可以发布 DrawItem 中的代码,但此代码对此行为没有任何影响,因为没有 drawitem 代码,组合框的反应完全相同。

我希望这个问题足够清楚。

【问题讨论】:

  • 这是你可以通过阅读MSDN ComboBoxDropDown Documentation来真正解决的问题
  • 我只是查看了该文档,但找不到可以帮助我的任何内容。该示例适用于 DropDownStyle = DropDown,这不是我使用的。也许您可以指出我需要的文档中的部分?
  • 那你用什么作为默认的 DropDownStyle..?
  • dropdownstyle = DropDownList(问题中多次提到)
  • 您能否为其中一个下拉框显示您的实际代码

标签: c# winforms combobox


【解决方案1】:

我的好朋友谷歌来了,这段代码似乎解决了我的问题:

const int WM_LBUTTONDOWN = 0x0201;
const int WM_LBUTTONDBLCLK = 0x0203;

protected override void WndProc(ref Message m)
    {
        // only open dropdownlist when the user clicks on the arrow on the right, not anywhere else...
        if (m.Msg == WM_LBUTTONDOWN || m.Msg == WM_LBUTTONDBLCLK)
        {
            int x = m.LParam.ToInt32() & 0xFFFF;
            if (x >= Width - SystemInformation.VerticalScrollBarWidth)
                base.WndProc(ref m);
            else
            {
                Focus();
                Invalidate();
            }
        }
        else
            base.WndProc(ref m);
    }

【讨论】:

  • 很高兴您是少数知道如何与朋友Google联系的新手之一
  • 我可能是 stackoverflow 和 c# 方面的新手,但在截止日期的压力下编程和寻找解决方案并不是新手...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多