我在虚拟模式和线程化的DataGridView控件上遇到了一个奇怪的问题。我使用Cache类来存储两个页面的数据。当我向下滚动时,我必须在缓存中加载一个新页面,在显示数据之前会有一点延迟(这是可以的)。但是,控件跳过许多行(CellValueNeeded),而不是显示下一行(199、200、201)。例如,我缓存了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;
}附言:这只是一个代码片段,我使用了一个外部API从ODB中提取数据。此API使用线程加载数据。
发布于 2011-09-16 03:01:40
谁有主意或者我可以解决这个问题?
您可以在后台线程中加载数据,但不能将其添加到后台线程本身的主DataTable中。
一种可能的方法是像您所做的那样加载数据,但是加载到单独的DataTable中。然后,您可以在UI线程上调用DataSet.Merge来正确地将此数据与您的绑定数据合并(这将是相当快的)。
发布于 2011-09-16 21:14:50
最后,我找到了解决方案。当踏步正在处理并且向下滚动按钮被按下时,我的滚动事件不会被发送到数据网格,除非我的线程完成。所以我收到了一堆关于绘制单元格的电话,索引是错误的。为了避免这种情况,我从datagridview中删除了vs滚动条,并添加了一个VSscrollbar控件。当我在线程中加载数据时,我将滚动条上的enable属性设置为false。当线程完成时,我启用滚动条。不是最好的解决方案,但至少现在跳过了行。
注意:如果不在单独的线程中加载数据,虚拟模式工作得很好。
https://stackoverflow.com/questions/7435984
复制相似问题