Winforms:如何正确打开组合框?

21

我在WinForms上有一个下拉框,在进入事件中打开它:

cbo.DroppedDown = true;

但是,如果我这样做,组合框会立即打开和关闭。我做错了什么?

我使用此事件的原因是我需要在Tab上打开组合框,当用户点击前一个控件上的Tab时,此组合框会正确地打开。但是,如果用户单击组合框,则会打开并关闭。如何正确地操作?

谢谢


3
你应该尽可能接受更多的答案,这样会得到更频繁和更好的回答。 - Yetti
5个回答

27

我就是这样尝试的:

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

鼠标弹起事件和定时器没有变化,它的行为与预期相同。无论我是用鼠标单击还是使用Tab键进入下拉框,下拉列表都会出现并保持打开状态直到我选择了其中的某个选项。

我会检查是否有其他东西将焦点移出了该框。


((ComboBox)sender).DroppedDown = true; - SHIN JaeGuk

3
您遇到这个问题的原因是鼠标弹起事件发生在输入事件之后,且默认窗口程序正在关闭下拉框。
在输入事件中,您可以检查鼠标按钮状态,如果按下则不打开下拉框。然后再为鼠标弹起事件添加另一个事件处理程序来打开下拉框。
另一种选择是设置一个几毫秒的计时器,在计时结束时打开下拉框。

通过可能更好的解决方案扩展了答案。 - Ben
如果 EventArgs e 没有这样的字段,我该如何检查鼠标? - mimic

3

虽然这个方法有点老,但我发现它很有效。你可以通过TAB键进入下拉框并打开它,如果你点击箭头,它不会关闭。

private void ComboBox_Enter(object sender, EventArgs e)
    {            
        if (MouseButtons == MouseButtons.None)
            ((System.Windows.Forms.ComboBox)sender).DroppedDown = true;
    }

0
在组合框的GotFocus事件中设置DroppedDown = true。否则,下拉列表将显示在错误的位置。
void cbo_GotFocus(object sender, EventArgs e)
    {
        ComboBox cbo = sender as ComboBox;
        cbo.DroppedDown = true;
    }

0

我认为你需要先将焦点集中在它上面,然后再打开comboBox。

cbo.Focus();
cbo.DroppedDown = True

希望它对你有用。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接