首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >datagridview虚拟模式,则update RowCount将导致对所有行触发CellValueNeeded

datagridview虚拟模式,则update RowCount将导致对所有行触发CellValueNeeded
EN

Stack Overflow用户
提问于 2011-12-07 01:46:54
回答 5查看 7.4K关注 0票数 6

我正在尝试实现datagridview的虚拟模式,但是当我将RowCount设置为某个数字(以显示滚动条)时,网格希望一次显示所有行,而不仅仅是显示的行。

代码语言:javascript
运行
复制
DataGridView grid = new ...;

grid.VirtualMode = true;
grid.CellValueNeeded += OnCellValueNeeded;
grid.RowCount = dataprovider.GetFullCount();

我如何告诉网格只请求显示的行?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2012-01-23 23:32:17

不幸的是,这似乎是标准行为。我可以通过以下两种方式解决

代码语言:javascript
运行
复制
void OnCellValueNeeded(...)
{
    if(!_active) return;
}

grid.VirtualMode = true;
grid.CellValueNeeded += OnCellValueNeeded;
_active = false;
grid.RowCount = dataprovider.GetFullCount();
_active = true;

或者在后台线程中使用复杂的延迟抓取来实现IBindingList、ITypedList

更新:这个问题现在似乎已经解决了。我不能再使用以下命令重现它:

代码语言:javascript
运行
复制
static class Program
{
    private static Form form;
    private static int i;

    [STAThread]
    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);

        var grid = new DataGridView
        {
            Dock = DockStyle.Fill,
            VirtualMode = true,
            AllowUserToAddRows = false,
            Columns =
            {
                new DataGridViewTextBoxColumn { HeaderText = "foo" },
                new DataGridViewTextBoxColumn { HeaderText = "bar" },
            },
        };
        grid.CellValueNeeded += OnCellValueNeeded;
        form = new Form
        {
            Controls = { grid }
        };

        //grid.RowCount = 0;
        grid.RowCount = 10000;

        Application.Run(form);
    }

    private static void OnCellValueNeeded(object sender, DataGridViewCellValueEventArgs e)
    {
        i++;
        form.Text = i.ToString();
        e.Value = "fooValue";
    }
}
票数 1
EN

Stack Overflow用户

发布于 2011-12-07 02:18:01

这只是一个猜测,但是您是否已将AutoSizeRowsMode或AutoSizeColumnsMode值设置为AllCells,或者是否有任何列设置为该值?尝试将调整大小模式设置为None或仅设置为DisplayedCells,看看是否仍然有问题。

票数 5
EN

Stack Overflow用户

发布于 2013-06-05 04:35:28

我不确定这是不是和我遇到的问题一样,但是当我经常在VirtualMode DataGridView上大刀阔斧地更改RowCount时,我的性能确实非常差。

我注意到滚动条正在“缓慢”地改变;也就是说,它看起来像是在单独移除我的虚拟行(!)。

无论如何,在每次调用grid.RowCount = n之前执行一次grid.Rows.Clear()将极大地提高性能。

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

https://stackoverflow.com/questions/8404336

复制
相关文章

相似问题

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