在datagridview虚拟模式下,更新RowCount会导致所有行都触发CellValueNeeded

Fir*_*iro 5 .net c# datagridview winforms

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

DataGridView grid = new ...;

grid.VirtualMode = true;
grid.CellValueNeeded += OnCellValueNeeded;
grid.RowCount = dataprovider.GetFullCount();
Run Code Online (Sandbox Code Playgroud)

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

Kle*_*nux 5

这只是一个猜测,但是您是否已将AutoSizeRowsMo​​de或AutoSizeColumnsMode值设置为AllCells或将任何列设置为该值?尝试将调整大小模式设置为“无”或仅设置为“ DisplayedCells”,看看是否仍然存在问题。


Pau*_*ott 5

不确定这是否与我遇到的问题相同,但是当定期大幅更改 VirtualMode DataGridView 上的 RowCount 时,我的性能确实很差。

我注意到滚动条正在“缓慢”变化;即它看起来像是在单独删除我的虚拟行(!)。

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


Fir*_*iro 1

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

void OnCellValueNeeded(...)
{
    if(!_active) return;
}

grid.VirtualMode = true;
grid.CellValueNeeded += OnCellValueNeeded;
_active = false;
grid.RowCount = dataprovider.GetFullCount();
_active = true;
Run Code Online (Sandbox Code Playgroud)

或在后台线程中实现 IBindingList、ITypedList 和复杂的延迟获取

更新:问题现在似乎已解决。我无法再使用以下命令重现它:

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";
    }
}
Run Code Online (Sandbox Code Playgroud)