簡體   English   中英

如何真正快速地選擇 ListBox 中的所有項目?

[英]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

找到了另一種方式,那就是“更快”:

[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.

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