2009-06-01 201 views
20

我需要在列表框中选择所有项目被点击一个复选框时。是否可以使用一行代码来选择ListBox中的所有项目?或者我将不得不循环遍历所有项目并为每个项目设置为true?列表框中选择所有项目

谢谢:)

回答

5

我想你必须在这里循环。一次选择所有项目是一个非常具体的(可能很少见的)用例,在这种情况下,提供这种功能是没有意义的。此外,循环将只是两行代码。

55

事实是ListBox.Items是一个普通的对象集合,并返回普通无类型的对象,不能是多选择的(默认)。

如果你想多选择所有项目,那么这将工作:

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

这应该是公认的答案。 – 2015-04-30 12:44:39

7

我已经看到了一些(类似的)回答所有这一切在逻辑上做同样的事情,我很困惑,为什么还他们都不为我工作。关键是将列表框的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 

OR

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

如果添加'e.SuppressKeyPress = true;'它应该工作,不管SelectionMode。 – 2014-12-24 14:14:57

1

我用Mika的解决方案,但是如果你有上千项这可能是非常缓慢的。为了大幅度提高速度,您可以暂时关闭可视性。列表框在操作过程中不会真正消失,因为您可能会怀疑,但在我的情况下,选择速度至少快10倍。

​​
+6

我相信'myListBox.Visible = false'更快,因为它避免了更新时的绘图。我会使用提供的方法'myListBox.BeginUpdate()'和'myListBox.EndUpdate()':) – DiogoNeves 2012-05-22 09:09:48

+1

+1来评论DiogoNeves。它更好,因为它也会导致焦点留在列表框中。对于Robin的解决方案,必须在将其设置为可见后再调用myListBox.Focus()。 – huha 2014-03-04 08:24:00

7

据我所知,使用任何的.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)); 
+0

不错的尝试。它确实选择了所有项目,但项目枚举失败。问题是,在SendMessage选择所有项目后,我得到SelectedItems.Count显示所有列表框项目的计数(这是正确的)。但是当我试图枚举SelectedItems时 - 只执行一次迭代。当我执行'SelectedItems [SelectedItems.Count - 1]'抛出IndexOutOfRange异常。似乎选择了项目,但列表框不会刷新与它们的内部列表。要计算'SelectedObjectCollection.Count'属性getter发送另一个返回所有项目计数的窗口消息。 – oleksa 2014-06-06 13:59:00

+0

-1不是那么神奇,请参阅[LB_SETSEL消息(Windows)](http://msdn.microsoft.com/de-de/library/windows/desktop/bb761352%28v=vs.85%29.aspx) 。顺便说一句:它适用于VCL类TListBox。 – Wolf 2015-01-15 12:19:30

+0

嗨,@狼。术语“魔术”在编程中有特别的意义;请参阅http://en.wikipedia.org/wiki/Magic_number_(programming) – EricLaw 2015-01-15 17:13:23

-4
private void Button_Click(object sender, RoutedEventArgs e) 
    { 

      listbox.SelectAll(); 

    } 
+0

哪个版本的.Net是这个? – 2014-10-27 00:10:42

+0

WinForms列表框中没有SelectAll方法。你可能正在考虑WPF列表框,但这个问题被标记为“winforms”和“.net-2.0”。 – 2014-12-24 13:19:11

0

这绝对不是好的,但不是一个循环,如果你有很多很多(100+)项目快得多: 选择列表框和模拟[家居]键输入[SHIFT] + [结束]

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

编辑:用SelectionMode.MultiExtended只能我猜

DoubleEDit:也意识到这可能是代码lb.selecteditems战后正在执行太慢ds,但对于用户点击的[Select All]按钮可能会有用。

+0

不适用于我(使用.Net 4.7)。列表框只是闪烁,就是这样。 – 2017-10-26 15:49:14

1

在这个构造函数,你需要启用所需的文本框的多选择模式(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]按钮+左击单独选择项目。

-1

选择全部是definetly现成可用的:

$("#ListBoxID option").prop("selected", true); 
+1

该问题是为winforms而不是网络 – 2017-02-19 23:41:12

+0

此代码也不是开箱即用。列出的代码是jQuery,而不是C#/ VB.NET – fujiiface 2017-06-14 22:27:44

1

我知道这个问题被打上.NET 2.0,但如果你有LINQ提供给您的3.5+,你可以做以下:

ASP.NET的WebForms

var selected = listBox.Items.Cast<System.Web.UI.WebControls.ListItem>().All(i => i.Selected = true); 

的WinForms

var selected = listBox.SelectedItems.Cast<int>().ToArray(); 
+0

不 - 我得到无法找到类型或名称ListItem。 (您是否缺少Using指令或程序集引用)。 – 2017-10-26 15:50:54

+0

看起来有点过分,可能会降低解决方案的效率,而不是与个人合作,找出解决方案为什么不适合您。你有没有提到缺少使用指令'使用System.Web.UI.WebControls;'?您是否参考装配体?答复已更新以引用装配体。 – fujiiface 2017-10-26 16:28:51

+0

对不起fujiface - 我再次提醒你。我最初以为你在2014年写了你的帖子,所以我没有期待回复。我似乎无法访问System.Web.UI.WebControls。我只能看到System.Web。我试图添加一个引用,但它并没有显示在那里。也许它在4.7中被弃用了?我查找了一个名称为NuGet的软件包,但这也不在其中。 – 2017-10-26 16:35:41