C#中的DataGridView控件(虚拟模式)与线程技术

3
我在虚拟模式和线程中使用DataGridView控件时遇到了一个奇怪的问题。我使用缓存类来存储2页数据。当我向下滚动并且必须在缓存中加载新页面时,会有一些延迟才会显示数据(这是可以接受的)。但是,控件跳过了许多行(CellValueNeeded),而不是显示下一行(199、200、201)。例如,我将1到200行缓存,当我在第199行滚动时,我正在加载200至299页。然而,在datagrid中,它显示了第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使用线程来加载数据。

2个回答

1
有人有想法或者知道我该如何解决这个问题吗?
你可以在后台线程中加载数据,但是不能在后台线程本身中将其添加到主 DataTable 中。
一个潜在的方法是按照你正在做的方式加载数据,但是加载到一个单独的 DataTable 中。然后,在 UI 线程上调用 DataSet.Merge 将此数据正确地合并到你的绑定数据中(这将相当快速)。

0

终于,我找到了解决方案。当线程正在处理并按下向下滚动按钮时,我的滚动事件不会发送到数据网格,除非我的线程完成。因此,我收到了许多绘制单元格的调用,而索引是错误的。为了避免这种情况,我从datagridview中删除了vs滚动条,并添加了一个VSscrollbar控件。当我在线程中加载数据时,我将我的滚动条的启用属性设置为false。当线程完成时,我启用滚动条。这不是最好的解决方案,但至少现在没有跳过行。

注意:如果您不在单独的线程中加载数据,则虚拟模式非常有效。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接