【问题标题】:How to auto open a ComboBox when focused?聚焦时如何自动打开组合框?
【发布时间】:2018-10-17 13:05:56
【问题描述】:

我有一个包含多个组合框的表单。

我希望其中的一个 ComboBox 在获得焦点时打开元素列表,无论是通过键盘还是鼠标。

ComboBox 类的DroppedDown 属性管理元素列表的可见性。

最符合我需求的事件是Enter,所以我写的代码是:

private void comboBox1_Enter(object sender, EventArgs e)
{
    this.comboBox1.DroppedDown = true;
}

它可以工作,但是当直接单击位于没有焦点的组合框右侧的图标时,元素列表打开,打开后突然消失。

我尝试了很多方法来解决这个奇怪的行为,检查Focused 属性或使用其他事件,如DropDownMouseClick,但没有得到任何可接受的结果。

【问题讨论】:

  • 如果我错了,请纠正我,但是“组合框右侧的图标”是一个箭头,是吗?关了就开,开就关?
  • 是的,这个图标是一个三角形/箭头,随着这个变化它失去了原来的行为。
  • 正如@MaxB所说,当它被下拉时(箭头看起来被按下)点击它意味着你想关闭它,否则你为什么要点击它?如果你想要一些不同于平常的功能,你必须创建自己的自定义控件。
  • @AshkanMobayenKhiabani 我刚刚编辑了这个问题,因为我的解释不是很准确。对不起
  • @alessaro 我的解决方案对你有用吗?

标签: c# winforms combobox dropdown


【解决方案1】:

一种简单的方法(不会强制您覆盖ComboBox 派生控件的WndProc)是模拟HitTest,测试是否发生了MouseDownComboBox 按钮区域;然后,仅在未设置 DroppedDown = true; 时设置。

因此,当鼠标单击按钮时,不会造成双重效果,即以意想不到的方式移动焦点(对于控件)。

private void comboBox1_Enter(object sender, EventArgs e)
{
    ComboBox combo = sender as ComboBox;
    if (!combo.DroppedDown)
    {
        if (combo.PointToClient(Cursor.Position).X < 
            combo.ClientRectangle.Width - SystemInformation.VerticalScrollBarWidth)
        {
            combo.DroppedDown = true;
            Cursor = Cursors.Arrow;
        }
    }
}

【讨论】:

    【解决方案2】:

    创建一个继承自 ComboBox 的新类:

    public class Combo : ComboBox
    {
         protected override void OnClick(EventArgs e)
         {
             if (!DroppedDown) base.OnClick(e);
         }           
    }
    

    如果没有下拉,则在其点击调用base.OnClick(e); 中。 使用这个而不是组合框。 (基本上点击事件下拉会被忽略)

    【讨论】:

    • 即使我在我的表单中为 Combo 对象实例的 Click 事件中的 DroppedDown 属性分配 true 而不是 Enter ,通过键盘(tab press)将焦点放在组合框上也不会触发该事件.
    • 我认为你错了,你所有的代码都保留了,例如private void comboBox1_Enter(object sender, EventArgs e) { this.comboBox1.DroppedDown = true; },而不是组合框,使用组合类
    • 我已经用你的 Combo 替换了 ComboBox 对象实例,但是使用 Enter 事件保持与以前相同的行为。
    【解决方案3】:

    在表单构造函数中使用以下代码:

    this.comboBox1.GotFocus += (sender,args) =&gt; comboBox1.DroppedDown = true;

    【讨论】:

    • 最好改成:this.comboBox1.Enter += (snd, evt) =&gt; { comboBox1.Cursor = Cursors.Arrow; comboBox1.DroppedDown = true; };sender 如果它是一个事件处理程序(例如,Form.Load),可能会让你与当前方法发生冲突。将 Cursor 设置回 Arrow 指针,因为在 Enter/GotFocus 事件中它已被 Edit 控件更改为 Beam。但是,它不会解决报告的问题。
    • 我也试过这个解决方案,但没有解决我的问题。
    猜你喜欢
    • 1970-01-01
    • 2020-07-06
    • 1970-01-01
    • 1970-01-01
    • 2018-06-25
    • 1970-01-01
    • 2012-04-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多