【发布时间】:2009-12-16 04:02:30
【问题描述】:
我有两个列表框。
在 listbox1 中,我希望用户能够单击一个按钮并将所有选定的项目移动到列表框 2。此外,如果没有选择任何内容,我不希望按钮工作。有人有什么建议吗?
listbox1.items.add(listbox2.selecteditems);只是移动(集合)到第二个列表框。
【问题讨论】:
标签: c#
我有两个列表框。
在 listbox1 中,我希望用户能够单击一个按钮并将所有选定的项目移动到列表框 2。此外,如果没有选择任何内容,我不希望按钮工作。有人有什么建议吗?
listbox1.items.add(listbox2.selecteditems);只是移动(集合)到第二个列表框。
【问题讨论】:
标签: c#
我猜你需要单独移动这些项目:
List<object> itemsToRemove = new List<object>();
foreach (var item in listbox2.SelectedItems)
{
listbox1.Items.Add(item);
itemsToRemove.Add(item);
}
foreach (var item in itemsToRemove)
{
listbox2.Items.Remove(item);
}
这会将所有选定的项目从listbox2 移动到listbox1。 itemsToRemove 列表用作临时存储,因为在迭代集合时不能修改集合;在迭代时,我们只是将要删除的项目的引用添加到一个临时列表中,然后我们迭代该列表并删除这些项目。
为了处理没有选择项目的情况,我会为SelectedIndexChanged事件设置一个事件处理程序,并设置按钮的Enabled属性:
theButton.Enabled = (listbox2.SelectedItems.Count > 0);
【讨论】:
这是一个使用 Linq 的解决方案:
private void buttonMove_Click(object sender, EventArgs e)
{
foreach (var item in listBox1.SelectedItems.OfType<object>().ToArray())
{
listBox1.Items.Remove(item);
listBox2.Items.Add(item);
}
}
private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
{
buttonMove.Enabled = listBox1.SelectedItems.Count > 0;
}
【讨论】:
.ToArray() 很重要,因此您不会在foreach 期间修改集合。
对于 Winforms:
foreach (var i in listbox1.SelectedItems) {
listbox2.SelectedItems.add(i);
}
仅在必要时启用按钮,将代码添加到OnSelectionChanged 事件并设置button1.enabled = (Listbox1.SelectedItems.Count > 0);
【讨论】:
if (listbox1.SelectedItems.Count == 0)
{
return;
}
// Do this if you want to clear the second ListBox
listbox2.Items.Clear();
foreach (object obj in listbox1.SelectedItems)
{
listbox2.Items.Add(obj);
}
【讨论】:
对于 Listbox1,使用 SelectedItemChanged 事件并使用您提供的 EventArgs 来获取所选项目 -> 然后添加到 listbox2。
如果没有选择任何项目 button.enbable = false;
【讨论】: