【问题标题】:How can I programmatically close a ComboBox drop down in VB.NET?如何以编程方式关闭 VB.NET 中的 ComboBox 下拉菜单?
【发布时间】:2011-04-15 18:09:39
【问题描述】:

在 Windows 窗体应用程序 (VB.NET) 中,我有一个组合框,在某些情况下,当用户打开下拉列表时,我想显示一条警告消息。 所有这些都运行良好:在 DropDown 事件中,我检查条件,如果需要,我会显示警告消息。 问题是,当用户在警告消息上单击“是”时,我移动到主窗体上的另一个选项卡,即使我已经离开包含组合框的选项卡,下拉列表仍然显示。 我已经搜索了很多并尝试将 DroppedDown 设置为 False,调用 OnDropDownClosed 等,但没有任何效果。 似乎当我尝试从 DropDown 事件中关闭下拉列表时,它不起作用。 任何人都可以提出任何建议吗?

感谢到目前为止的回答。我忘了说我使用的是 .NET framework 2。

【问题讨论】:

  • 好的,我找到了一个简单的工作解决方案。就在移动到另一个选项卡之前(通过引发自定义事件),我将 ConboBox DropDownStyle 更改为 ComboBoxStyle.DropDownList,然后将其设置回其原始值 ComboBoxStyle.DropDown。
  • 更改下拉样式为我解决了问题。

标签: .net vb.net winforms


【解决方案1】:

这里的问题是 WinForms 在引发事件之后将鼠标“捕获”到下拉列表。因此,在您的事件处理程序中,您无法阻止下拉菜单。您可以做的就是安排鼠标“取消捕获”。

    private void comboBox1_DropDown(object sender, EventArgs e)
    {
        Dispatcher.CurrentDispatcher.BeginInvoke((Action)(()=>comboBox1.Capture=false));
    }

在 .NET 4 中,Dispatcher 位于 System.Windows.Threading 命名空间下的 WindowsBase 程序集中。

【讨论】:

    【解决方案2】:

    这为我解决了这个问题:

    private void comboBox_DropDown(object sender, EventArgs e)
    {
        Dispatcher.CurrentDispatcher.BeginInvoke((Action)(() => this.comboBox.DroppedDown = false));
    }
    

    【讨论】:

      猜你喜欢
      • 2021-11-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多