簡體   English   中英

datagridview虛擬模式,更新RowCount會導致CellValueNeeded為所有行觸發

[英]datagridview virtual mode, update RowCount causes CellValueNeeded to fire for all rows

我正在嘗試實現datagridview的虛擬模式,但是當我將RowCount設置為某個數字(顯示滾動條)時,網格希望一次擁有所有行,而不僅僅是顯示的行。

DataGridView grid = new ...;

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

如何告訴網格只請求顯示的行?

這只是一個猜測,但您是將AutoSizeRowsMo​​de或AutoSizeColumnsMode值設置為AllCells還是設置為該列的任何列? 嘗試將調整大小模式設置為無或僅顯示DisplayedCells並查看是否仍有問題。

不確定這是否與我遇到的問題相同,但是當我經常在VirtualMode DataGridView上徹底改變RowCount時,我確實得到了很差的性能。

我注意到的是滾動條正在“慢慢地”變化; 即它看起來像是單獨刪除我的虛擬行(!)。

無論如何,在每次調用grid.RowCount = n之前做一個grid.Rows.Clear()大大提高性能。

在設置完整計數之前,應將RowCount設置為零。

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

不幸的是,這似乎是標准行為。 我可以解決它

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

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

或實現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";
    }
}

我遇到了同樣的問題,我嘗試了像你一樣設置活動標志的解決方案,我也嘗試了在設置新的RowCount之前將RowCount設置為0(或grid.Rows.Clear())的解決方案。

這兩個方面都提高了性能,但是它們都沒有足夠快,因為我根據搜索框的輸入實時動態過濾網格。

我發現了另外兩個解決方案

1)使用分頁,這樣您就不必將RowCount設置得如此之高。 我認為這是一個很好的解決方案,如果你已經在使用分頁(在這種情況下你不會在這里),但如果你沒有計划實現它,那就太麻煩了。

2)調用將RowCount設置在自己的線程中。 這是我即將嘗試的那個。 老實說,如果你在線程仍在完成時嘗試編輯單元格,那么這個單元是多么安全,但我想我很快就會發現。

編輯:

好吧,所以我試着穿上它,希望能夠做到這一點,因為我在其他地方看到它確實幫助了另一個人。 這似乎是一個很好的解決方案, 如果您只是偶爾更改一次值,但如果連續多次(我是),它仍然會掛起。 我想這是因為你必須使用Invoke(),第二次它還在等待第一次完成。 不能說我完全理解這筆交易是什么,但是我決定暫時只使用空白行,因為當我把它們放在那里時它的SOOO更快更簡單。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM