我正在研究代表和简单的线程,我在ComboBox
控件中尝试了它,并在DataGridViewComboBoxColumn
中进行了实验(因为我认为它会是相同的)但似乎没有{{ 1}}这种属性。
如何在线程中设置DataGridViewComboBoxColumn属性?
请参阅我的代码,这适用于使用线程设置Invoke
控件的属性:
ComboBox
请帮助......提前谢谢。
答案 0 :(得分:1)
使用您正在使用的DataGridView实例的InvokeRequired
属性和Invoke
方法。因为列链接到特定的DGV,所以它们应该在同一个线程上。
编辑:一些示例代码
private void SetProperties(DataTable dataSource, string valueMember, string displayMember)
{
if (dataGridView1.InvokeRequired){
dataGridView1.Invoke(new DelegateSetProperties(SetProperties), dataSource, valueMember, displayMember);
return;
}
dataGridViewComboBoxColumn1.DataSource = dataSource;
dataGridViewComboBoxColumn1.DisplayMember = valueMember;
dataGridViewComboBoxColumn1.ValueMember = displayMember";
}
并更改说明的行
//dataGridViewComboBoxColumn1.Invoke(delegateSetEvents, new object[] { dataSource, "ShortName", "LongName" });
});
是
SetProperties(dataSource, "ShortName", "LongName");
您希望在SetProperties内部执行InvokeRequired检查,以确保该方法是线程安全的。否则,如果方法在调用SetProperties之前没有确定它是在正确的线程上,则可能导致非法的交叉线程操作
答案 1 :(得分:1)
创建如下所示的功能
private delegate void SetControlPropertyThreadSafeDelegate(Control control, string propertyName, object propertyValue);
public static void SetControlPropertyThreadSafe(Control control, string propertyName, object propertyValue)
{
if (control.InvokeRequired)
{
control.Invoke(new SetControlPropertyThreadSafeDelegate(SetControlPropertyThreadSafe), new object[] { control, propertyName, propertyValue });
}
else
{
control.GetType().InvokeMember(propertyName, BindingFlags.SetProperty, null, control, new object[] { propertyValue });
}
}
称之为
// thread-safe equivalent of
// myLabel.Text = status;
SetControlPropertyThreadSafe(myLabel, "Text", status);
//In your case get the object of the dgv combo column
SetControlPropertyThreadSafe(dgvComboColumn, "Property", Value);
OR
如果您使用的是.NET 3.5或更高版本,则可以将上述方法重写为Control类的扩展方法,这样可以简化对以下内容的调用:
myLabel.SetPropertyThreadSafe("Text", status);
//In your case get the object of the dgv combo column
dgvComboColumn.SetPropertyThreadSafe("Property", Value);
OR
试试这个
this.Invoke((MethodInvoker)delegate {
dgvComboColumn.FieldName= xColumnName; // runs on UI thread
dgvComboColumn2.Visible = true; // runs on UI thread
});
Stackoverflow参考:How to update the GUI from another thread in C#?