[英]Virtual DataGridView with multi-colored rows causes CellValueNeeded to race
[英]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();
如何告訴網格只請求顯示的行?
這只是一個猜測,但您是將AutoSizeRowsMode或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.