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
但是如果你使用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(); } }
}