[英]How to select all items in a ListBox really fast?
我在綁定到數據源 (BindingList) 的窗體(Windows 窗體)上有一個所有者繪制的 ListBox。 我需要提供一個選項來快速選擇所有項目(最多 500000)。
這就是我目前正在做的事情:
for (int i = 0; i < listBox.Items.Count; i++)
listBox.SetSelected(i, true);
這是令人難以置信的緩慢且不可接受的。 有人知道更好的解決方案嗎?
假設這是一個Windows Forms
問題:Windows 窗體將在每個選定項之后繪制更改。 要禁用繪圖並在完成后啟用它,請使用BeginUpdate()
和EndUpdate()
方法。
listBox.BeginUpdate();
for (int i = 0; i < listBox.Items.Count; i++)
listBox.SetSelected(i, true);
listBox.EndUpdate();
我找不到一種速度快到可以接受的方法。 我嘗試了 BeginUpdate/EndUpdate,這有幫助,但在英特爾酷睿 i5 筆記本電腦上仍然需要 4.3 秒。 所以這很蹩腳,但它有效 - 至少它在 IDE 中有效。 ListBox 在表單上稱為 lbxItems 我有一個名為 Select All 的按鈕。 在那個按鈕的點擊事件中,我有:
//save the current scroll position
int iTopIndex = lbxItems.TopIndex;
//select the [0] item (for my purposes this is the top item in the list)
lbxItems.SetSelected(0, true);
// put focus on the listbox
lbxItems.Focus();
//then send Shift/End (+ {END}) to SendKeys.SendWait
SendKeys.SendWait("+{END}");
// restore the view (scroll position)
lbxItems.TopIndex = iTopIndex;
結果:這會在幾毫秒內選擇 10,000 個項目。 和我實際使用鍵盤一樣
你可以試試 listbox.SelectAll();
以下是有關 ListBox SelectAll() 的 Microsoft 文檔的鏈接:
https://msdn.microsoft.com/en-us/library/system.windows.controls.listbox.selectall(v=vs.110).aspx
您可以使用 SelectAll() 方法。
Listbox.SelectAll();
找到了另一種方式,那就是“更快”:
[DllImport("user32.dll", EntryPoint = "SendMessage")]
internal static extern IntPtr SendMessage(IntPtr hWnd, UInt32 msg, IntPtr wParam, IntPtr lParam);
// Select All
SendMessage(listBox.Handle, 0x185, (IntPtr)1, (IntPtr)(-1));
// Unselect All
SendMessage(listBox.Handle, 0x185, (IntPtr)0, (IntPtr)(-1));
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.