首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >c# DatagridView控件(VirtualMode)和线程

c# DatagridView控件(VirtualMode)和线程
EN

Stack Overflow用户
提问于 2011-09-16 02:57:17
回答 2查看 637关注 0票数 3

我在虚拟模式和线程化的DataGridView控件上遇到了一个奇怪的问题。我使用Cache类来存储两个页面的数据。当我向下滚动时,我必须在缓存中加载一个新页面,在显示数据之前会有一点延迟(这是可以的)。但是,控件跳过许多行(CellValueNeeded),而不是显示下一行(199、200、201)。例如,我缓存了1到200行,当我以199的速度滚动时,我将一个页面加载到200à299。然而,在数据网格中,它显示行320..而不是300。(在松开它之前,我一直按住鼠标按钮2-3秒)。我注意到只有在加载特定线程中的缓存时才会出现问题。有人知道我该怎么解决这个问题吗?

代码语言:javascript
复制
    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使用线程加载数据。

EN

回答 2

Stack Overflow用户

发布于 2011-09-16 03:01:40

谁有主意或者我可以解决这个问题?

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

一种可能的方法是像您所做的那样加载数据,但是加载到单独的DataTable中。然后,您可以在UI线程上调用DataSet.Merge来正确地将此数据与您的绑定数据合并(这将是相当快的)。

票数 1
EN

Stack Overflow用户

发布于 2011-09-16 21:14:50

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7435984

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档