C#从列表框中删除项目

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

我试过这个:

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

但它给了我错误:

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

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

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

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

这是一个工作的例子:

 List listbox = new List(); List toRemove = new List(); 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")); 

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

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

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

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

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

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

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

你可以试试这个方法:

 List temp = new List(); 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%确定它是完全正确的,我很久以前就用它了。

你得到的错误意味着

 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)不应该递增(因为您刚删除它)。

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

 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); } } 

您的问题意味着您愿意修改代码的其他部分,即使您无法修改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); } } 

但是如果你绝对决定这样做的话,你应该在迭代它时修改一个可枚举的集合 。

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

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

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

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

你可以使用Linq在一行中完成

 listBox1.Cast().Where(p=>p.Text.Contains("OBJECT")).ToList().ForEach(listBox1.Items.Remove); 

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

 List 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); } } 

没有“ listBoxWork.DataSource = null; ”这一行,我listBoxWork.DataSource = null; ,“ 价值不在预期的范围内

 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 toBeRemoved = new List(); 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); } 

您也可以使用以下代码:

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

}