【问题标题】:Winforms: how to open combobox properly?Winforms:如何正确打开组合框?
【发布时间】:2011-08-14 03:42:27
【问题描述】:

我在 winforms 上有一个组合框。在 Enter 上,即使我打开它:

cbo.DroppedDown = true;

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

我使用这个事件的原因是我需要在 Tab 上打开组合,当用户点击前一个控件上的选项卡时,这个组合正确打开。但是,如果用户单击组合,它将打开和关闭。如何正确地做到这一点?

谢谢

【问题讨论】:

  • 嗯,你真的应该努力接受更多的答案。您将获得更频繁和更好的答案。

标签: c# winforms combobox


【解决方案1】:

我是这样试的:

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

mouseup 或计时器没有变化。它的行为与预期的一样。无论我是通过鼠标单击选择组合框还是通过标签进入它,下拉列表都会出现并保持打开状态,直到我选择了某些内容。

我会看看是否还有其他东西可以将焦点从盒子中拉出来。

【讨论】:

    【解决方案2】:

    您遇到此问题的原因是因为 mouseup 事件发生在 enter 事件之后,并且默认窗口过程正在关闭组合框。

    在回车中你可以检查鼠标按钮的状态,如果按钮被按下,不要打开组合。然后让 mouseup 事件的另一个事件处理程序打开组合。

    另一种选择是设置一个几毫秒的计时器,并在它关闭时打开组合。

    【讨论】:

    • 用可能的更好的解决方案扩展了答案。
    • 如果 EventArgs e 没有这样的字段,我如何检查鼠标?
    【解决方案3】:

    知道这有点老了,但我发现这很好用。您可以按 Tab 键进入组合框,它会打开,如果您单击箭头,它不会关闭。

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

    【讨论】:

      【解决方案4】:

      在组合框的 GotFocus 事件中设置 DroppedDown = true。否则,下拉列表将显示在错误的位置。

      void cbo_GotFocus(object sender, EventArgs e)
          {
              ComboBox cbo = sender as ComboBox;
              cbo.DroppedDown = true;
          }
      

      【讨论】:

        【解决方案5】:

        我认为你只需要在打开组合框之前先聚焦它。

        cbo.Focus();
        cbo.DroppedDown = True
        

        希望它对你有用。

        【讨论】:

          猜你喜欢
          • 2016-10-08
          • 1970-01-01
          • 1970-01-01
          • 2012-10-15
          • 2011-10-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多