首先我将发布代码,它很短,很清楚。cb_currentProfile是加载表单时填充3项的ComboBox:
delegate void SetCurrentProfileCallback(int index);
private void SetCurrentProfile(int index) // Set index of Combobox.SelectedItem
{
if (this.cb_currentProfile.InvokeRequired)
{
SetCurrentProfileCallback d = new SetCurrentProfileCallback(SetCurrentProfile);
this.Invoke(d, new object[] { index });
}
else
{
this.cb_currentProfile.SelectedItem = 2; // Won't work
this.cb_currentProfile.Visible = false; // It works
}
}
问题是,当我试图改变SelectedItem属性,然后它不会做什么(没有崩溃,只是什么都没有发生)。
我确信在我的表单应用程序中到达了此代码。
现在我正在。net 4.6中制作它(但它在v4.5中也不能工作)
我调用这个方法的地方在Task body:Task.Run(() =>
{
while(true)
{
// ...
SetCurrentProfile(2);
// ...
Thread.Sleep(100);
}
});
我认为这个问题与数据源有关,它似乎是不可见的其他线程而不是主UI。
我也确信数据在代码到达任务创建之前被加载到ComboBox。
编辑1 -所选项目为null, Count属性返回0
当我使用调试器检查一些数据时,结果是:
var x = this.cb_currentProfile.SelectedItem; // null
var y = this.cb_currentProfile.Items.Count; // 0
看起来,对于this.cb_currentProfile.SelectedItem = 2
语句,您打算通过索引设置ComboBox
的选择。组合框。SelectedItem属性接受一个Object
,并尝试在它的项目集合中找到它,如果成功,选择它,否则不做任何事情。要选择ComboBox
的特定索引,请设置组合框。