C#从列表框中删除项目

时间:2010-01-19 19:38:35

标签: c#

我有一个从SQLDATA pull中填充的列表框,它会删除一些我不想要的列,如OBJECT_dfj,OBJECT_daskd。关键是所有这些都是OBJECT_,有没有办法从列表框中删除它们?我无法更改我的SQL语句。

我试过这个:

 foreach (string item in listBox1.Items)
 {
     string removelistitem = "OBJECT";
     if(item.Contains(removelistitem))
     {
         listBox1.Items.Remove(item);
     }
 }

但它给了我错误:

  

此枚举器绑定的列表已被修改。只有在列表没有更改时才能使用枚举器。

16 个答案:

答案 0 :(得分:19)

你不能使用枚举器,你必须使用索引循环,从最后一项开始:

for (int n = listBox1.Items.Count - 1; n >= 0; --n)
{
    string removelistitem = "OBJECT";
    if (listBox1.Items[n].ToString().Contains(removelistitem))
    {
        listBox1.Items.RemoveAt(n);
    }
}

答案 1 :(得分:5)

在枚举时,您无法修改枚举器中的引用;你必须跟踪要删除的那些然后删除它们。

这是一个解决方案的例子:

List<string> listbox = new List<string>();
List<object> toRemove = new List<object>();

foreach (string item in listbox)
{
    string removelistitem = "OBJECT";
    if (item.Contains(removelistitem))
    {
        toRemove.Add(item);
    }
}

foreach (string item in toRemove)
{
    listbox.Remove(item);
}

但是如果你使用的是c#3.5,你可以这样说。

listbox.Items = listbox.Items.Select(n => !n.Contains("OBJECT"));

答案 2 :(得分:2)

你想通过使用计数器而不是foreach来向后迭代。如果您向前迭代,则必须在删除项目时调整计数器。

for(int i=listBox1.Items.Count - 1; i > -1; i--) {
{
    if(listBox1.Items[i].Contains("OBJECT"))
    {
        listBox1.Items.RemoveAt(i);
    }
}

答案 3 :(得分:0)

您获得的错误意味着

foreach (string item in listBox1.Items)

应替换为

for(int i = 0; i < listBox1.Items.Count; i++) {
    string item = (string)listBox1.Items[i];

换句话说,不要使用foreach。

编辑:在上面的代码中添加了强制转换为

EDIT2:由于您正在使用RemoveAt(),请记住下一次迭代的索引(上例中的变量i)不应该递增(因为您刚删除它)。

答案 4 :(得分:0)

使用foreach迭代时,无法修改集合。您可以尝试使用常规for()语句。

您可能需要从集合的末尾向后迭代,以确保覆盖集合中的每个项目,并且在删除项目后不会意外地超出集合的末尾(因为长度会发生变化)。我不记得.NET是否说明了这种可能性。

答案 5 :(得分:0)

这里的问题是,当您从列表中删除项目时,您正在更改枚举器。这对于'foreach'循环无效。但几乎任何其他类型的循环都可以。

所以你可以尝试这样的事情:

for(int i=0; i < listBox1.Items.Count; )
{
    string removelistitem = "OBJECT";
    if(listBox1.Items[i].Contains(removelistitem))
         listBox1.Items.Remove(item);
    else
        ++i;
}

答案 6 :(得分:0)

你可以尝试这种方法:

List<string> temp = new List<string>();

    foreach (string item in listBox1.Items)
    {
        string removelistitem = "OBJECT";
        if(item.Contains(removelistitem))
        {
            temp.Items.Add(item);
         }
     }

    foreach(string item in temp)
    {
       listBox1.Items.Remove(item);
    }

这应该是正确的,因为它只是将内容复制到临时列表,然后用于从ListBox中删除它。

其他人请随意提及更正,因为我不是100%确定这是完全正确的,我很久以前就用它了。

答案 7 :(得分:0)

对不起家伙我不得不调整字符串

sqldatapull = dr[0].ToString();
                if (sqldatapull.StartsWith("OBJECT"))
                {
                    sqldatapull = "";
                }
                listBox1.Items.Add(sqldatapull);
                for (int i = listBox1.Items.Count - 1; i >= 0; i--)
                {
                    if (String.IsNullOrEmpty(listBox1.Items[i] as String))
                        listBox1.Items.RemoveAt(i);
                }
            }

答案 8 :(得分:0)

您的问题意味着您愿意修改代码的其他部分,即使您无法修改SQL语句本身。而不是从ListBox集合中删除它们,可能更容易从一开始就排除它们。此代码假定您正在连接到SQL Server:

void PopulateListBox(ListBox listToPopulate)
{
    SqlConnection conn = new SqlConnection("myConnectionString"); 
    SqlCommand cmd = new SqlCommand("spMyStoredProc", conn);
    cmd.CommandType = CommandType.StoredProcedure;
    SqlDataReader reader = cmd.ExecuteReader();
    while (reader.Read())
    {
        string item = reader.GetString(0); //or whatever column is displayed in the list
        if (!item.Contains("OBJECT_"))
            listToPopulate.Items.Add(item); 
    }
}

但如果你绝对决定这样做,你应该在modifying an enumerable collection while iterating through it上查看这个问题。

答案 9 :(得分:0)

如果您不想处理枚举器,也可以尝试这样做:

object ItemToDelete = null;
foreach (object lsbItem in listbox1.Items)
{
   if (lsbItem.ToString() == "-ITEM-")
   {
      ItemToDelete = lsbItem;                                  
   }
}

if (ItemToDelete != null)
    listbox1.Items.Remove(ItemToDelete);

答案 10 :(得分:0)

使用此代码,您可以删除列表框中的所有项目... 请注意,您应该在按钮的单击事件中编写此代码:

        if (listBox1.SelectedIndex != -1)
        {
            listBox1.Items.RemoveAt(listBox1.SelectedIndex);
        } 

答案 11 :(得分:0)

您可以使用Linq

在1行中完成
listBox1.Cast<ListItem>().Where(p=>p.Text.Contains("OBJECT")).ToList().ForEach(listBox1.Items.Remove);

答案 12 :(得分:0)

如果您的列表框项目是通过数据源分配的话,我发现了很难的方法

List<String> workTables = hhsdbutils.GetWorkTableNames();
listBoxWork.DataSource = workTables;

......你必须在拆除之前取消绑定:

listBoxWork.DataSource = null;
for (int i = listBoxWork.Items.Count - 1; i >= 0; --i)
{
    if (listBoxWork.Items[i].ToString().Contains(listboxVal))
    {
        listBoxWork.Items.RemoveAt(i);
    }
}

没有&#34; listBoxWork.DataSource = null;&#34;线,我得到了,&#34; 价值不在预期范围内&#34;

答案 13 :(得分:0)

protected void lbAddtoDestination_Click(object sender, EventArgs e)
        {
            AddRemoveItemsListBox(lstSourceSkills, lstDestinationSkills);
        }
        protected void lbRemovefromDestination_Click(object sender, EventArgs e)
        {
            AddRemoveItemsListBox(lstDestinationSkills, lstSourceSkills);
        }
        private void AddRemoveItemsListBox(ListBox source, ListBox destination)
        {
            List<ListItem> toBeRemoved = new List<ListItem>();
            foreach (ListItem item in source.Items)
            {
                if (item.Selected)
                {
                    toBeRemoved.Add(item);
                    destination.Items.Add(item);
                }
            }
            foreach (ListItem item in toBeRemoved) source.Items.Remove(item);
        }

答案 14 :(得分:0)

您也可以使用以下代码:

 foreach (var item in listBox1.Items.Cast<string>().ToList())
 {
     string removelistitem = "OBJECT";
     if (item.Contains(removelistitem))
     {
        listBox1.Items.Remove(item);
     }
 }

答案 15 :(得分:0)

   for (int i = 0; i < listBox1.Items.Count; i++)
    {
        if (textBox1.Text == listBox1.Items[i].ToString())
        {
            jeElement = true;
            break;
        }
    }
    if (jeElement)
    {
        label1.Text = "je element";
    }
    else
    {
        label1.Text = "ni element";
    }
    textBox1.ResetText();
    textBox1.Focus();

}

private void Form1_KeyDown(object sender, KeyEventArgs e)
{
    if (e.Alt == true && e.KeyCode == Keys.A)
    {
        buttonCheck.PerformClick();
    }
}

}