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

我的目标是根据下拉列表的索引从下拉列表中选择一个项。所以我就这么做:
//I know for sure that i >= 0 && i < comboBox.Items.Count
comboBox.SelectedIndex = i; //i = index of the existing item这很好,除非在上面这一行之后的某一段时间我会显示一条消息:
MessageBox.Show("Error");在这种情况下,组合框中的项目在我对这台计算机的测试中大约在80%的时间内被选中。很明显,这里有一些时间问题。
我需要知道的是,选择ComboBox项目的“确定”方式是什么?(我的意思是,确保在执行其后面的下一行代码时选中了它,或者执行它为synchronously。)
PS。我知道我可以简单地将文本分配给它的Text属性,但这不是我想要的。您可以在我的ComboBox实现中看到,我可以为每个项分配自定义对象,另外,我还依赖于许多基于选择的事件,比如SelectedIndexChanged。
PS2。我不确定这是只影响DropDown样式的组合框,还是所有这些。
发布于 2013-11-07 08:27:54
消息框中断ComboBox处理以更新所选索引。这种行为是断断续续的,因为窗体和控件(如ComboBox和消息框)依赖于。在选择更改和消息框的同时,表单的其他部分可能生成数百条消息(有时更多,有时更少)。当消息数量很大时,系统可能无法处理某些消息,因此所选索引不会更改。
为了避免这个问题,有两个选择:
i后设置i。BeginInvoke (下面的示例)异步检查您的健康状况,即。在系统完成了对已更改的选定索引的消息处理之后。使用BeginInvoke:的一种方法
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得到你想要的行为,就像另一个答案所暗示的那样,但是我会支持这种方法。
https://stackoverflow.com/questions/19825516
复制相似问题