我的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 03:30:24
我敢打赌,当您更改该选择时触发的事件在打开MessageBox之前不会被处理。
尝试添加以下内容:
Application.DoEvents();..。在你打电话给MessageBox.Show();之前,看看这是否有帮助。如果是这样,则可以尝试通过以下方式使控件重新绘制自身。
comboBox.Refresh();如果您正在线程化,可以尝试comboBox.Invoke。而且,PerformLayout在Form/Control上有时会迫使这类事情立即发生,而不是等待一个画图消息。
MessageBox.Show在其轨道上停止所有表单处理。最终的解决方案可能是把它放在一个不同的地方,当你确信组合框已经做了它需要做的一切。
发布于 2013-11-07 00:20:48
当您将对象作为您的SelectedValue的源时,您可以使用SelectedItem和ComboBox来实现这一点。
看看这篇文章:理解SelectedValue,SelectedValuePath,SelectedItem和DisplayMemberPath。您也可以运行代码示例。
从该条中:
SelectedItem:这将返回在thelist/combobox/容器中选择的当前项。这是一个您可以看到的对象(因为我的列表包含对象)。如果您的List/Combobox/etc包含一个字符串列表,那么它将是一个字符串。如果它包含int,它将是一个int。
SelectedValuePath:设置这将使属性SelectedValue返回您在这里选择的属性的值。在我们的示例中,选择"ShapeColor“将使SelectedValue只返回颜色,而不是整个形状对象。
SelectedValue:如果您只想要一个对象的一部分,那么设置上面的属性,然后在这里得到该属性的值。注意,如果不使用SelectedValuePath,这与使用SelectedItem是一样的。
DisplayMemberPath:将其设置为对象的属性,将导致GUI在选择类时显示该属性,而不是看到类名或类ToString()方法(应该始终提供该方法)。请看本书的ToC中的第5项)。
免责声明:我是这篇文章的作者。
发布于 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
复制相似问题