如何非常快速地选择列表框中的所有项

本文关键字:列表 选择 何非常 非常 | 更新日期: 2023-09-27 18:31:33

我在窗体(Windows 窗体)上有一个所有者绘制的ListBox绑定到数据源(BindingList)。我需要提供一个选项来非常快速地选择所有项目(最多 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 中是这样。列表框在窗体上称为 lbxItems 我有一个名为"全选"的按钮。在该按钮的单击事件中,我有:

//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() 上的 Microsoft 文档链接:

https://msdn.microsoft.com/en-us/library/system.windows.controls.listbox.selectall(v=vs.110).aspx

您可以使用 SelectAll() 方法。

Listbox.SelectAll();

https://msdn.microsoft.com/en-us/library/system.windows.controls.listbox.selectall(v=vs.110).aspx?cs-save-lang=1&cs-lang=csharp#code-snippet-2

找到了另一种方式,那就是"更快":

[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));