首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
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

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
查看全部 3 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19825516

复制
相关文章

相似问题

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