当DataGridView是可编辑的时,Threadsafe更新DataGridView / Dataset

时间:2011-03-14 16:53:00

标签: c# multithreading datagridview dataset

我有一个包含数据集ds和DataGridView dgv的WinForms应用程序。 dgv绑定到ds。

ds通过Task()更新,该Task使用TableAdapter.Fill()方法定期查询数据库。我在这里遇到两个问题。

  1. 更新ds时,除非调整窗口大小或其他某些事件导致重绘表单,否则不会刷新dgv。

  2. 当用户开始在dgv中编辑单元格时,ds会更新,并且由于多个线程访问相同的GUI控件而导致UI崩溃。我试图使用一个标志EditModeOn,它是由DataGridView dgv中的某些事件设置的,虽然这对防止线程错误没有帮助。

  3. 使用DataGridView可以由用户编辑并通过更改绑定数据集(在另一个线程中更新)更新的最佳方法是什么?

2 个答案:

答案 0 :(得分:2)

对于第2点,您可以使用Control类中的函数Invoke。该函数将在UI线程中执行该函数。

http://msdn.microsoft.com/en-us/library/zyzhdc6b.aspx

实施例。 :

// Invoke an anonymous method on the thread of the form.
this.Invoke((MethodInvoker) delegate
{
    //Call your function to update your datagridview with the dataset in parameters
    ...
});

答案 1 :(得分:1)

在第1点,你可以通过调用Form.Invalidate()来解决这个问题。这将使你的表格重新粉饰;这有点脏,但它应该做的。

在第2点,如果你有一个正在从另一个线程更新控件内容的Task,那么你应该总是获得一个异常,因为从任何线程访问一个控件是非法的除了UI线程(创建UI的线程)之外。所以我不太清楚你是怎么做的。

但是,我要做的是使用线程检索结果,然后将这些结果存储在成员变量(字段)中。然后定期检查该字段以查看是否需要刷新数据,如果从字段中获取数据并将其放入网格中,然后将该字段清零。您可以使用System.Windows.Forms.Timer类的Tick事件来实施此定期检查。

在更新例程中,您可以检查标记以查看是否正在编辑网格,并忽略更新,直到稍后。