如何在线程中设置DataGridViewComboBoxColumn的属性? (C#Winforms)

时间:2010-09-29 05:02:19

标签: c# winforms multithreading delegates

我正在研究代表和简单的线程,我在ComboBox控件中尝试了它,并在DataGridViewComboBoxColumn中进行了实验(因为我认为它会是相同的)但似乎没有{{ 1}}这种属性。

如何在线程中设置DataGridViewComboBoxColumn属性?
请参阅我的代码,这适用于使用线程设置Invoke控件的属性:

ComboBox

请帮助......提前谢谢。

2 个答案:

答案 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#?