虚拟模式和线程中的DataGridView控件存在一个奇怪的问题。我使用Cache类来存储2页数据。当我向下滚动并且我必须在缓存中加载新页面时,在显示数据之前有一点延迟(没关系)。但是,而不是拥有 显示下一行(第199,第200,第201),控件跳过多行(CellValueNeeded)。例如,我缓存了1到200行,当我在199滚动时,我正在将页面加载到200à299。但是,在数据网格中它显示行320而不是300.(我按住了鼠标按钮)在释放之前2-3次。我注意到只有在特定线程中加载缓存时才会出现问题。有谁知道如何解决这个问题?
private void datagridView_CellValueNeeded(object sender, DataGridViewCellValueEventArgs e)
{
e.Value = m_rfiCache.RetrieveElement(e.RowIndex, e.ColumnIndex);
}
....
public DataTable SupplyPageOfData(int lowerPageBoundary, int rowsPerPage)
{
e : " + lowerPageBoundary);
DataTable dt = new DataTable();
if (m_useThreading) //THIS DOESN'T WORK WELL
{
Thread MulThread = new Thread(delegate()
{
dt = this.LoadData(lowerPageBoundary, rowsPerPage);
});
MulThread.Start();
MulThread.Join();
}
else //OK.
{
dt = this.LoadData(lowerPageBoundary, rowsPerPage);
}
return dt;
}
P.S。 :这只是一个片段,我使用外部API从ODB中提取数据。此API使用线程加载数据。
答案 0 :(得分:1)
有没有人有想法或者我可以解决这个问题?
您可以在后台线程中加载数据,但不能在后台线程本身中将其添加到主DataTable中。
一种可能的方法是在您执行时加载数据,但将其加载到单独的DataTable中。然后,您可以在UI线程上调用DataSet.Merge以正确地将此数据与您的绑定数据合并(这将是合理的快速)。
答案 1 :(得分:0)
最后,我找到了解决方案。当踏板处理并按下向下滚动按钮时,除非我的线程完成,否则我的滚动事件不会发送到数据网格。所以我收到了一堆绘制单元格的调用,索引错了。为了避免这种情况,我从datagridview中删除了vs滚动条并添加了一个VSscrollbar控件。当我在我的线程中加载数据时,我将滚动条上的启用属性设置为false。线程完成后,我启用滚动条。不是最佳解决方案,但至少现在已经跳过了行。
注意:如果不在单独的线程中加载数据,虚拟模式可以很好地工作。