与具有数据源(ComboBox)的控件进行跨线程工作



首先我将发布代码,它很短,很清楚。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的特定索引,请设置组合框。

相关内容

  • 没有找到相关文章

最新更新