【问题标题】:Unable to transfer Selected Items of a ListBox to another ListBox无法将列表框的选定项传输到另一个列表框
【发布时间】:2012-03-18 06:43:42
【问题描述】:

我无法将所选项目从一个 ListBox 转移到另一个 ListBox:

 protected void Button2_Click(object sender, EventArgs e)
    {
        foreach (ListItem li in ListBox2.Items)
        {
            if (li.Selected)
            {
                ListItem liNew = new ListItem(li.Text, li.Value);                
                ListBox1.Items.Add(liNew);
                ListBox2.Items.Remove(liNew);
            }
        }
    }

我遇到了异常:

System.InvalidOperationException:集合已修改;枚举操作可能无法执行。

【问题讨论】:

    标签: c# asp.net .net listbox


    【解决方案1】:

    问题是您无法在迭代集合时从集合中移除元素。相反,您可以选择已选择的项目 :) 并遍历它们。

    foreach(ListItem li in ListBox2.Items.Where(x => x.Selected)) {
        ListItem liNew = new ListItem(li.Text, li.Value);
        ListBox1.Items.Add(liNew);
        ListBox2.Items.Remove(li);
    }
    

    (另外,我认为您的意思是li,而不是liNew。)


    没有 LINQ,它可能看起来像:

    List<ListItem> toRemove = new List<ListItem>();
    
    foreach(ListItem li in ListBox2.Items) {
        if(li.Selected) {
            ListItem liNew = new ListItem(li.Text, li.Value);
            ListBox1.Items.Add(liNew);
            toRemove.Add(li);
        }
    }
    
    foreach(ListItem li in toRemove) {
        ListBox2.Items.Remove(li);
    }
    

    此外,您可以使用for 循环,正如@Steve 所建议的那样:

    for(int i = ListBox2.Items.Count; --i >= 0;) {
        ListItem li = ListBox2.Items[i];
    
        if(li.Selected) {
            ListItem liNew = new ListItem(li.Text, li.Value);
            ListBox1.Items.Add(liNew);
            ListBox2.Items.RemoveAt(i);
        }
    }
    

    【讨论】:

    • 那么如何在将项目移动到另一个列表框后删除它们
    • @minitech 我希望建议(对于非 LINQ 示例)使用反向 for 循环。这将允许直接从列表框中删除,不需要第二个循环。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-19
    • 1970-01-01
    • 1970-01-01
    • 2018-11-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多