我的代码工作正常但是,当我创建线程时,我尝试将项目添加到ComboBox
时无法使用跨线程操作。我在backgroundworker
中尝试了此代码但错误相同
new Thread(GetInfo).Start();
public void GetInfo()
{
while (true)
{
if (SellerControlGroup.Enabled)
{
SqlDataReader Type = new SqlCommand("select type from _Price where Service = 1", sqlCon.con).ExecuteReader();
while (Type.Read())
{
string type = Convert.ToString(Type["type"]);
ProgramType.Items.Add(type);
}
Type.Close();
}
}
}
答案 0 :(得分:2)
您可以从创建的主题更新控件,并且无法从另一个主题更新它。
下面是从另一个线程创建的同一线程更新控件的工作代码。
new Thread(GetInfo).Start();
public void GetInfo()
{
while (true)
{
if (SellerControlGroup.Enabled)
{
SqlDataReader Type = new SqlCommand("select type from _Price where Service = 1", sqlCon.con).ExecuteReader();
while (Type.Read())
{
string type = Convert.ToString(Type["type"]);
// Update control with the same thread its been created
this.Invoke((MethodInvoker)delegate()
{
ProgramType.Items.Add(type);
});
}
Type.Close();
}
}
}
答案 1 :(得分:0)
您可以使用委托来调用UI线程上的更改,如此
delegate void AddItemDelegate(ComboBox cmb, string value);
void AddItem(ComboBox cmb, string value) {
if (cmb.InvokeRequired) {
cbm.Invoke( new AddItemDelegate( AddItem ), cmb, value );
} else {
cmb.Items.add(value);
}
}
然后只需使用
AddItem( ProgramType, type );