从c#中的线程更新datagridview行

时间:2010-08-10 11:42:00

标签: c# windows multithreading datagridview

我在Windows窗体应用程序上有一个datagridview。

应用程序将所有显示的数据发布到外部网站。网站返回代码,以便应用程序确定发布数据的状态。

我需要创建一个参数化线程,它将行索引作为参数并发布行数据并通过返回值更新它。 (可能涉及更改行背景颜色和更改列值)

我的想法有可能吗?还是有更好的方法?

2 个答案:

答案 0 :(得分:1)

好吧,由于DataGridView是一个GUI控件,您将无法从另一个线程对其进行更改。您必须向主GUI线程发送消息。幸运的是,C#对此有很好的支持。写一个方法(大概在你的主要表格类中),它可以完成实际的工作:

public void SetRowFromWebResult(int row, Color background, ...)
{
    // ...
}

然后,在您的主题中,使用表单对象上的Invoke方法 (而不是委托):

myForm.Invoke(() => myForm.SetRowFromWebResult(row, background, ...));

所以你可能会在这样的线程中运行你的HTTP请求:

int row = ...;
var myThread = new Thread(() =>
{
    // Fire off the request
    var request = WebRequest.Create(...);
    var response = ...;

    // Calculate the parameters (e.g. row background color)
    Color background = (response.Code == ...) ? ... : ...;

    // Tell the GUI to update the DataGridView
    myForm.Invoke(() => myForm.SetRowFromWebResult(row, background, ...));
});
myThread.Start();

答案 1 :(得分:0)

另外,您可以使用后台工作线程来防止跨线程异常。

此致