我试图从文件加载数据列表并立即在Winforms的Datagridview上显示该数据。为此,我使用Backgroundworker在另一个线程中进行了阅读。问题是,它只更新一次,我不能让它显示更多的数据。不仅如此,单击时,它会尝试访问具有-1索引的元素,这当然不存在,导致崩溃。Winforms Datagridview无法从委托刷新
通常,从我所看到的情况来看,只需将相同的数据添加到数据源dataGridView1.DataSource = samelist;
即可使用,但在此情况下不起作用。
BackgroundWorker的工作
private void bw_DoWork(object sender, DoWorkEventArgs e)
{
BackgroundWorker worker = sender as BackgroundWorker;
//lotsofCode...
while (readData != null)
{
fooLists.Add(readData);
//someCalculations...
worker.ReportProgress();
}
}
的BackgroundWorker的progressChanged
private void bw_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
this.Invoke((MethodInvoker)delegate { UpdateGridView(); });
}
UpdateGridView方法
private void UpdateGridView()
{
if (fooLists.GetListById(1).calculatedList != null)
dataGridView1.DataSource = fooLists.GetListById(1).calculatedList;
}
后来我读过堆栈,其中一个用BindingSource
所建议的一些线程“中间人“,所以现在我有dataGridView1.DataSource = MyBindingSource;
我n组件初始化和tab1source.DataSource = fooLists.GetListById(1).calculatedList;
而不是dataGridView1.DataSource
。它确实有所帮助,因为列表现在可以按照它的方式点击,但列表中仍然只有少量记录。
没有dataGridView1.Refresh()
,dataGridView1.RefreshEdit()
或dataGridView1.Update()
帮助,虽然使列表加载稍微有点fancier(可能是由于延迟他们介绍:))。我试图做一些“保护”(信号量,所以代理不会再次被调用,而工作;尝试捕获,虽然没有例外抛出;重写前的数据清除...),但“更好的版本“和这个一样糟糕,只会使代码变得暗淡。
我错过了更新Datagridview控件的方法吗?提前致谢。
fooLists是什么类型? – WithMetta
@WithMetta这是一个列表清单的自定义类。该方法返回标准列表。 –
Midas
看看https://social.msdn.microsoft.com/Forums/en-US/18a9762e-ac67-48a7-a372-55307fe344f3/how-do-you-refresh-data-bound-to-a-datagridview ?forum = winformsdatacontrols 您可能需要调用父控件的刷新方法。另外我不确定表达式“dataGridView1.DataSource = fooLists.GetListById(1).calculateList;”有效地执行不止一次。想想看。您将数据源设置为您已经设置的相同对象。如果是这样的话,它可能会在内部检查它并且不更新视图。 – WithMetta