首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >ComboBox中具有DropDown样式的项的可靠选择

ComboBox中具有DropDown样式的项的可靠选择
EN

Stack Overflow用户
提问于 2013-11-07 00:08:49
回答 3查看 611关注 0票数 0

我的WinForms应用程序中有一个具有DropDown样式的DropDown,换句话说,它允许用户键入一个值,或者从下拉列表中选择它。它看起来是这样的:

我的目标是根据下拉列表的索引从下拉列表中选择一个项。所以我就这么做:

代码语言:javascript
运行
复制
//I know for sure that i >= 0 && i < comboBox.Items.Count
comboBox.SelectedIndex = i;  //i = index of the existing item

这很好,除非在上面这一行之后的某一段时间我会显示一条消息:

代码语言:javascript
运行
复制
MessageBox.Show("Error");

在这种情况下,组合框中的项目在我对这台计算机的测试中大约在80%的时间内被选中。很明显,这里有一些时间问题。

我需要知道的是,选择ComboBox项目的“确定”方式是什么?(我的意思是,确保在执行其后面的下一行代码时选中了它,或者执行它为synchronously。)

PS。我知道我可以简单地将文本分配给它的Text属性,但这不是我想要的。您可以在我的ComboBox实现中看到,我可以为每个项分配自定义对象,另外,我还依赖于许多基于选择的事件,比如SelectedIndexChanged

PS2。我不确定这是只影响DropDown样式的组合框,还是所有这些。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-11-07 03:30:24

我敢打赌,当您更改该选择时触发的事件在打开MessageBox之前不会被处理。

尝试添加以下内容:

代码语言:javascript
运行
复制
Application.DoEvents();

..。在你打电话给MessageBox.Show();之前,看看这是否有帮助。如果是这样,则可以尝试通过以下方式使控件重新绘制自身。

代码语言:javascript
运行
复制
comboBox.Refresh();

如果您正在线程化,可以尝试comboBox.Invoke。而且,PerformLayoutForm/Control上有时会迫使这类事情立即发生,而不是等待一个画图消息。

MessageBox.Show在其轨道上停止所有表单处理。最终的解决方案可能是把它放在一个不同的地方,当你确信组合框已经做了它需要做的一切。

票数 1
EN

Stack Overflow用户

发布于 2013-11-07 00:20:48

当您将对象作为您的SelectedValue的源时,您可以使用SelectedItemComboBox来实现这一点。

看看这篇文章:理解SelectedValue,SelectedValuePath,SelectedItem和DisplayMemberPath。您也可以运行代码示例。

从该条中:

SelectedItem:这将返回在thelist/combobox/容器中选择的当前项。这是一个您可以看到的对象(因为我的列表包含对象)。如果您的List/Combobox/etc包含一个字符串列表,那么它将是一个字符串。如果它包含int,它将是一个int。

SelectedValuePath:设置这将使属性SelectedValue返回您在这里选择的属性的值。在我们的示例中,选择"ShapeColor“将使SelectedValue只返回颜色,而不是整个形状对象。

SelectedValue:如果您只想要一个对象的一部分,那么设置上面的属性,然后在这里得到该属性的值。注意,如果不使用SelectedValuePath,这与使用SelectedItem是一样的。

DisplayMemberPath:将其设置为对象的属性,将导致GUI在选择类时显示该属性,而不是看到类名或类ToString()方法(应该始终提供该方法)。请看本书的ToC中的第5项)。

免责声明:我是这篇文章的作者。

票数 1
EN

Stack Overflow用户

发布于 2013-11-07 08:27:54

消息框中断ComboBox处理以更新所选索引。这种行为是断断续续的,因为窗体和控件(如ComboBox和消息框)依赖于。在选择更改和消息框的同时,表单的其他部分可能生成数百条消息(有时更多,有时更少)。当消息数量很大时,系统可能无法处理某些消息,因此所选索引不会更改。

为了避免这个问题,有两个选择:

  • 在检查显示消息框的新索引i后设置i
  • 使用BeginInvoke (下面的示例)异步检查您的健康状况,即。在系统完成了对已更改的选定索引的消息处理之后。

使用BeginInvoke:的一种方法

代码语言:javascript
运行
复制
comboBox.SelectedIndex = i;

// Sanity check new index i after message processing for the combo box.
comboBox.BeginInvoke(delegate()
{
    if (/* sanity check fails */)
    {
        MessageBox("Error");
    }   
});

编辑:,你可以通过使用Application.DoEvents得到你想要的行为,就像另一个答案所暗示的那样,但是我会支持这种方法。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19825516

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档