我有一个包含数据集ds和DataGridView dgv的WinForms应用程序。 dgv绑定到ds。
ds通过Task()更新,该Task使用TableAdapter.Fill()方法定期查询数据库。我在这里遇到两个问题。
更新ds时,除非调整窗口大小或其他某些事件导致重绘表单,否则不会刷新dgv。
当用户开始在dgv中编辑单元格时,ds会更新,并且由于多个线程访问相同的GUI控件而导致UI崩溃。我试图使用一个标志EditModeOn,它是由DataGridView dgv中的某些事件设置的,虽然这对防止线程错误没有帮助。
使用DataGridView可以由用户编辑并通过更改绑定数据集(在另一个线程中更新)更新的最佳方法是什么?
答案 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
事件来实施此定期检查。
在更新例程中,您可以检查标记以查看是否正在编辑网格,并忽略更新,直到稍后。