首页 > 解决方案 > 聚焦时如何自动打开组合框?

问题描述

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

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

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

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

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

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

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

问题的动画

标签: c#winformscomboboxdropdown

解决方案


一种简单的方法(不会强制您覆盖ComboBox派生的 Control's WndProc)是模拟HitTest,测试MouseDown是否发生在ComboBox按钮区域;然后,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;
        }
    }
}

推荐阅读