单击CheckBox时,我需要选择ListBox中的所有项目。是否可以使用一行代码选择ListBox中的所有项目?或者我是否必须遍历所有项目并将其中的每一项设置为true?
谢谢:)
答案 0 :(得分:62)
事实是ListBox.Items
是一个普通的对象集合并返回普通的无类型对象,这些对象不能被多选(默认情况下)。
如果您想多选所有项目,那么这将有效:
for (int i = 0; i < myListBox.Items.Count;i++)
{
myListBox.SetSelected(i, true);
}
答案 1 :(得分:8)
我已经看到了许多(类似的)答案,所有这些答案在逻辑上都是一样的,我很困惑为什么他们都不适合我。关键是将列表框的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
答案 2 :(得分:8)
据我所知,使用任何.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));
答案 3 :(得分:5)
我认为你必须在这里循环。一次选择所有项目是一个非常具体(可能很少见)的用例,开箱即用提供该功能毫无意义。此外,无论如何,循环只有两行代码。
答案 4 :(得分:1)
我使用Mika的解决方案,但如果你有数以千计的物品,这可能会非常慢。为了大幅提高速度,您可以暂时关闭可见性。在您可能怀疑的操作过程中,列表框实际上不会消失,但在我的情况下,选择的速度至少快10倍。
myListBox.Visible = false;
for (int i = 0; i < myListBox.Items.Count;i++)
{
myListBox.SetSelected(i, true);
}
myListBox.Visible = true;
答案 5 :(得分: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]按钮+左键单击分别选择项目。
答案 6 :(得分:1)
全选绝对可以直接使用:
$("#ListBoxID option").prop("selected", true);
答案 7 :(得分:1)
我知道这个问题是用.NET 2.0标记的,但如果您在3.5+中可以使用LINQ,则可以执行以下操作:
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();
答案 8 :(得分:0)
如果你有很多(100多个)项目,这绝对不是很好,但比循环要快得多: 选择列表框并模拟[home]和[shift] + [end]
的键输入lb.BeginUpdate();
lb.Select();
SendKeys.Send("{Home}");
SendKeys.Send("+{End}");
lb.EndUpdate();
编辑:仅适用于SelectionMode.MultiExtended我猜
DoubleEDit:也要注意,这对于之后使用lb.selecteditems执行的代码来说可能太慢了,但是对于用户将单击的[全选]按钮可能很有用。
答案 9 :(得分:0)
在我的情况下,我有超过10k件商品,基本的循环方法需要近一分钟才能完成。使用@DiogoNeves答案并扩展它,我希望能够选择全部(Ctrl + A)和复制(Ctrl + C)。我处理这两种方式。我使用BeginUpdate()和EndUpdate()推迟了绘图,但是我还添加了直接复制所有内容(Ctrl + Shift + C),甚至在复制之前都无需选择项目。
private static void HandleListBoxKeyEvents(object sender, KeyEventArgs e)
{
var lb = sender as ListBox;
// if copy
if (e.Control && e.KeyCode == Keys.C)
{
// if shift is also down, copy everything!
var itemstocopy = e.Shift ? lb.Items.Cast<object>() : lb.SelectedItems.Cast<object>();
// build clipboard buffer
var copy_buffer = new StringBuilder();
foreach (object item in itemstocopy)
copy_buffer.AppendLine(item?.ToString());
if (copy_buffer.Length > 0)
Clipboard.SetText(copy_buffer.ToString());
}
// if select all
else if (e.Control && e.KeyCode == Keys.A)
{
lb.BeginUpdate();
for (var i = 0; i < lb.Items.Count; i++)
lb.SetSelected(i, true);
lb.EndUpdate();
}
}
答案 10 :(得分:0)
我将nawfal的想法添加到了已有的东西中,这也是'BeginUpdate'的想法。另外,如用户所期望的,视图位置也得以保持。对我来说,这似乎可以解决所有问题:
public void SelectAll()
{
bool prevBusy = MouseHelper.IsBusy;
MouseHelper.IsBusy = true;
int topIndex = TopIndex;
// BUG: In 'SelectionMode.MultiExtended' the box gets crazy
SelectionMode previousMode = this.SelectionMode;
this.SelectionMode = SelectionMode.MultiSimple;
this.BeginUpdate();
for (int i = 0; i < Items.Count; i++)
{
SelectedIndices.Add(i);
}
this.EndUpdate();
this.SelectionMode = previousMode;
TopIndex = topIndex;
MouseHelper.IsBusy = prevBusy;
}
答案 11 :(得分:-4)
private void Button_Click(object sender, RoutedEventArgs e)
{
listbox.SelectAll();
}