c#DatagridView控件(VirtualMode)和线程

时间:2011-09-15 18:57:17

标签: c# .net datagridview

虚拟模式和线程中的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使用线程加载数据。

2 个答案:

答案 0 :(得分:1)

  

有没有人有想法或者我可以解决这个问题?

您可以在后台线程中加载数据,但不能在后台线程本身中将其添加到主DataTable中。

一种可能的方法是在您执行时加载数据,但将其加载到单独的DataTable中。然后,您可以在UI线程上调用DataSet.Merge以正确地将此数据与您的绑定数据合并(这将是合理的快速)。

答案 1 :(得分:0)

最后,我找到了解决方案。当踏板处理并按下向下滚动按钮时,除非我的线程完成,否则我的滚动事件不会发送到数据网格。所以我收到了一堆绘制单元格的调用,索引错了。为了避免这种情况,我从datagridview中删除了vs滚动条并添加了一个VSscrollbar控件。当我在我的线程中加载数据时,我将滚动条上的启用属性设置为false。线程完成后,我启用滚动条。不是最佳解决方案,但至少现在已经跳过了行。

注意:如果不在单独的线程中加载数据,虚拟模式可以很好地工作。