ListBox选择所有项目

单击CheckBox时,我需要选择ListBox中的所有项目。 是否可以使用一行代码选择ListBox中的所有项目? 或者我是否必须遍历所有项目并将其中的每一项设置为true?

谢谢 :)

我想你必须在这里循环。 一次选择所有项目是一个非常具体(可能很少见)的用例,开箱即用提供该function毫无意义。 此外,无论如何,循环将只有两行代码。

事实上, ListBox.Items是一个普通的对象集合,它返回普通的无类型对象,这些对象不能被多选(默认情况下)。

如果您想多选所有项目,那么这将有效:

  for (int i = 0; i < myListBox.Items.Count;i++) { myListBox.SetSelected(i, true); } 

据我所知,使用任何.NET方法选择大量项目远比进行直接PInvoke调用慢,将LB_SETSEL消息(0x185)传递给控件,​​并带有一个标志,指示是否要选择(1)或取消选择(0)以及魔术值(-1),表示更改应适用于所有项目。

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

我已经看到了许多(类似的)答案,所有这些答案在逻辑上都是一样的,我很困惑为什么他们都不适合我。 关键是将列表框的SelectionMode设置为SelectionMode.MultiSimple 。 它不适用于SelectionMode.MultiExtended 。 考虑到在列表框中选择多个项目,您将选择模式设置为多个模式,并且大多数人都采用传统的MultiExtended风格,这个答案应该有很多帮助。 而且你不是一个foreach ,而是for

你应该这样做:

 lb.SelectionMode = SelectionMode.MultiSimple; for (int i = 0; i < lb.Items.Count; i++) lb.SetSelected(i, true); lb.SelectionMode = //back to what you want 

要么

 lb.SelectionMode = SelectionMode.MultiSimple; for (int i = 0; i < lb.Items.Count; i++) lb.SelectedIndices.Add(i); lb.SelectionMode = //back to what you want 

我使用Mika的解决方案,但如果你有数以千计的物品,这可能会非常慢。 为了大幅提速,您可以暂时关闭可见性。 在您可能怀疑的操作过程中,列表框实际上不会消失,但在我的情况下,选择的速度至少快10倍。

 myListBox.Visible = false; for (int i = 0; i < myListBox.Items.Count;i++) { myListBox.SetSelected(i, true); } myListBox.Visible = true; 

在此构造函数中,您需要启用所需文本框的多选模式( MultiExtended )。

 public Form1() { InitializeComponent(); listBox1.SelectionMode = SelectionMode.MultiExtended; listBox2.SelectionMode = SelectionMode.MultiExtended; } 

在此之后,使用循环选择所有内容:

 private void selectAll_Click(object sender, EventArgs e) { for (int val = 0; val < listBox1.Items.Count; val++) { listBox1.SetSelected(val, true); } } 

我测试了它。 有用。 您也可以使用[CTRL / SHIFT]按钮+左键单击选择项目。

我知道这个问题是用.NET 2.0标记的,但如果您在3.5+中可以使用LINQ,则可以执行以下操作:

ASP.NET WebForms

 var selected = listBox.Items.Cast().All(i => i.Selected = true); 

的WinForms

 var selected = listBox.SelectedItems.Cast().ToArray(); 

如果您有许多(100+)个项目,这绝对不是很好,但比循环要快得多:选择列表框并模拟[home]和[shift] + [end]的键输入

 lb.BeginUpdate(); lb.Select(); SendKeys.Send("{Home}"); SendKeys.Send("+{End}"); lb.EndUpdate(); 

编辑:只有我才能使用SelectionMode.MultiExtended

DoubleEDit:也要注意,这对于之后使用lb.selecteditems执行的代码来说可能太慢了,但是对于用户将单击的[Select All]按钮可能很有用。

Select All绝对可以直接使用:

 $("#ListBoxID option").prop("selected", true); 
 private void Button_Click(object sender, RoutedEventArgs e) { listbox.SelectAll(); }