【问题标题】:Dropdown event before droppeddown flag is set设置下拉标志之前的下拉事件
【发布时间】:2015-03-20 22:53:32
【问题描述】:

我正在使用带有下拉样式的组合框:列表。
我需要隐藏下拉菜单,以防用户决定不更改值(特殊情况)。

问题是当调用下拉事件时,组合框下拉设置仍显示为 false。根据事件定义"dropdown": Occurs when the drop-down portion of a ComboBox is shown

那么当事件被调用时,“droppeddown”设置不应该是真的吗?

private void comboBoxSelectEntry_DropDown(object sender, EventArgs e)
{
    MessageBox.Show(comboBoxSelectEntry.DroppedDown.ToString());
    if (isChange || isOAWinShown)
        if (MessageBox.Show("Warning: You will loose current session data", "Warning", MessageBoxButtons.OKCancel) == DialogResult.Cancel)
        {
            this.comboBoxSelectEntry.DroppedDown = false;
            return;
        }

    List<string> _data = classes.databank.Anchor.Collection.Where(node => !node.retired).Select(node => node.Name).ToList();
    this.comboBoxSelectEntry.DataSource = null;
    this.comboBoxSelectEntry.DataSource = _data;
}

【问题讨论】:

  • 使用selectedIndex属性怎么样?如果索引相同且未更改,则隐藏它。
  • 不确定这将如何工作。只有在用户选择了不同的值后,才会调用 SelectedIndex 更改。如果我不隐藏下拉菜单,那么用户可以选择一个值,这将更改所选索引。
  • this.BeginInvoke(new Action(() => comboBoxSelectEntry.DroppedDown = false));这行得通,但不会让你兴奋,它和它会得到的一样好。重新设计你的 UI 以避免它。
  • @HansPassant,非常好的解决方法,但很棘手。再说一次,我的猜测是问题的真正答案那么当事件被调用时“下拉”设置不应该是真的吗?仍然是一个.. .
  • 绝对不,这是一个“即将下降”的通知。在显示消息框时看不到下拉菜单最明显。如果本机控件允许以某种方式取消它会很好,因此该事件可能有 CancelEventArgs 参数,但它不是这样设计的。

标签: c# winforms combobox


【解决方案1】:

实际上您已经提供了答案,对于您的问题“那么当调用事件时“下拉”设置不应该为真吗? DroppedDown 属性实际上是在显示下拉列表之后设置的。所以触发了事件,但是设置属性只是在组合框的内容可视化显示出来之后才设置的。

因此DropDown事件的命名是正确的,它会执行一个下拉事件来触发。触发(并显示列表)后,DroppedDown 属性设置为 true 并保持这种状态,直到用户选择一个项目。

MSDN 页面实际上是正确的,所以我想你可以不同意,但不要打扰。当时的设计是 DroppedDown 属性仅在事件触发后设置。以前没有。

如果您确实需要这种方法,请考虑重新设计您的 GUI(如 Hans Passant 在他的评论中提到的),或者如果您有时间创建自己的控件。

【讨论】:

  • 实际上您指向的页面是针对 WPF 组件的。我记得为此尝试了一个测试用例,并且该事件按应有的方式进行。调用事件时设置下拉属性。甚至事件的名称也不同“DropDownOpened”。另外,我不同意根据 MSDN 站点:“显示 ComboBox 的下拉部分时发生”,这意味着应该显示下拉,并且应该设置下拉标志。
  • 没错,我错过了 Winforms 标签,我很抱歉。一个可能的解决方法是使用SelectionChangeCommitted 事件。更多信息可以找到here
  • @RvdV79:你是对的。 DropDown 事件在即将显示下拉列表之前触发。这可以在the source code of the ComboBox class 中找到。
  • 是的,我必须同意你们俩@R.Beiboer 和RvdV79
  • 在组合框值更改后处理取消的请求将需要程序记住最后一个状态并重新加载它..(耗时)。现在我已经通过使用 mouse_click 事件解决了这个问题。显示下拉菜单后立即调用该事件。
猜你喜欢
  • 1970-01-01
  • 2017-11-01
  • 1970-01-01
  • 2013-03-28
  • 2015-09-09
  • 1970-01-01
  • 1970-01-01
  • 2011-05-27
  • 2013-01-29
相关资源
最近更新 更多