从其他线程更新时,DataGridView不会重新绘制自身

时间:2011-10-04 10:29:17

标签: c# winforms multithreading datagridview

我在从另一个线程更新DataGridView时遇到问题。让我解释。当用户单击表单上的按钮时,我需要使用某些行填充网格。这个过程需要一些时间,所以我在一个单独的线程中进行。在启动线程之前,我将DataGridView.Enabled属性设置为false,以防止用户在添加项目时编辑项目,并且在工作线程结束之前我将Enabled设置回{{1} }}

如果需要显示滚动条,问题是true将无法正确更新其内容。我将用截图说明这一点:

partially drawn row

如您所见,最后一个可见行部分绘制,DataGridView不会向下滚动。如果我调整网格大小,使其重新绘制,则所有行都会正常显示。

以下是一些代码:

DataGridView

我还注意到只有 private void button1_Click(object sender, EventArgs e) { string[] fileNames = new string[] { "file1", "file2", "file3" }; Thread AddFilesToListThread = new Thread(ThreadProcAddRowsToGrid); dataGridView1.Enabled = false; AddFilesToListThread.Start(fileNames); } delegate void EmptyDelegate(); private void ThreadProcAddRowsToGrid(object fileNames) { string[] files = (string[])fileNames; foreach (string file in files) { EmptyDelegate func = delegate { dataGridView1.Rows.Add(file); }; this.Invoke(func); } EmptyDelegate func1 = delegate { dataGridView1.Enabled = true; }; this.BeginInvoke(func1); } 属性会导致这种奇怪的行为。例如,更改Enabled可以正常工作。

你能帮我看看问题所在吗?

1 个答案:

答案 0 :(得分:2)

您是否尝试过DataGridView.Refresh()

也许设置readonly属性而不是dataGridView1.Enabled = true;?

或者,我认为这可以通过将数据与用户界面分开来解决。

在我看来,这是SO的简化示例,但如果可以,我建议更换等效行;

  

dataGridView1.Rows.Add(文件);

DataTable table = getData(); //In your snippet (file)
BindingSource source = new BindingSource();
source.DataSource = table
dataGridView1.Datasource = source;

然后您还可以使用BindingSource上的ResetBindings刷新数据;

table = getData();; //Update your data object
source.ResetBindings(false);