Bartłomiej Sobieszek
Bartłomiej Sobieszek

Reputation: 2800

Cross-thread work with Control which have a data source (ComboBox)

At first I will post the code, it is short and quite clear. cb_currentProfile is a ComboBox filled with 3 items when form is loaded:

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
    }
}

The problem is that when I try to change SelectedItem property, then it won't do nothing (no crash, just nothing happens).

I am sure that this code is reached in my form application.

At now I am making it in .NET 4.6 (but it was not working in v4.5 either)

The place where I am calling this method is in Task body:

Task.Run(() =>
{
    while(true)
    {
        // ...
        SetCurrentProfile(2);
        // ...
        Thread.Sleep(100);
    }
});

I think that the problem is related to DataSource that seems to be invisible by other thread than main UI's.

I am also sure that data are loaded to ComboBox before code reaches a Task creation.

Edit 1 - selected item is null, Count property returns 0

When I used a debugger to check for some data, the results are:

var x = this.cb_currentProfile.SelectedItem; // null
var y = this.cb_currentProfile.Items.Count;  // 0

Upvotes: 0

Views: 62

Answers (1)

Sartaglo
Sartaglo

Reputation: 97

It looks like, with the this.cb_currentProfile.SelectedItem = 2 statement, you intend to set the selection of the ComboBox by index. The ComboBox.SelectedItem Property accepts an Object and attempts to find it in its collection of items, selecting it if successful, and doing nothing otherwise. To select a particular index of the ComboBox, set the ComboBox.SelectedIndex Property instead.

Upvotes: 2

Related Questions