我有两个列表框,lstAvailableColors 和 lstSelectedColors。每个列表框之间有两个按钮,添加和删除。当在 lstAvailableColors 中选择一种或多种颜色并单击“添加”按钮时,我想将它们从 lstAvailableColors 中删除并在 lstSelectedColors 中显示。此外,如果在 lstSelectedColors 中选择了颜色并单击了删除按钮,我想从 lstSelectedColors 中删除颜色并将它们添加回 lstAvailableColors。当我这样做时,删除项目时出现以下错误:
集合已修改;枚举操作可能不会执行。
这是添加按钮和删除按钮的代码:
添加:
protected void btnAdd_Click(object sender, EventArgs e)
{
foreach (ListItem item in lstAvailableColors.Items)
{
if (item.Selected)
{
lstSelectedColors.Items.Add(item);
lstAvailableColors.Items.Remove(item);
}
}
}
删除:
protected void btnRemove_Click(object sender, EventArgs e)
{
foreach (ListItem item in lstSelectedColors.Items)
{
if (item.Selected)
{
lstAvailableColors.Items.Add(item);
lstSelectedColors.Items.Remove(item);
}
}
}
最佳答案
在 .Net 中枚举集合时,无法修改集合。您需要分离出您的枚举并将代码删除到不同的 block 中。这是一个快速示例,说明如何在没有 LINQ 的情况下执行此操作
protected void btnAdd_Click(object sender, EventArgs e)
{
var selected = new List<ListItem>();
foreach (ListItem item in lstAvailableColors.Items)
{
if (item.Selected)
{
selected.Add(item);
lstSelectedColors.Items.Add(item);
}
}
foreach (ListItem item in selected)
{
lstAvailableColors.Items.Remove(item);
}
}
这是一个使用 LINQ 的更简洁的版本
var selected = lstAvailableColors.Cast<ListItem>().Where(i => i.Selected).ToList();
selected.ForEach( x => { lstSelectedColors.Items.Add(x); });
selected.ForEach( x => { lstAvailableColors.Items.Remove(x);});
编辑
LINQ 版本分为两个部分。第一部分是查找当前选定项并将值存储在 List<ListItem>
中的第一行.该行包含 .ToList() 调用非常重要,因为这会强制查询立即执行而不是延迟执行。
接下来的两行遍历每个被选中的值,并将其删除或添加到适当的列表中。因为选择的列表已经存储,所以我们在修改它时不再枚举集合。
关于c# - 集合被修改;从 LIstBox 中删除 ListItem 时枚举可能不会执行错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/808006/