我有一个从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);
}
}
但它给了我错误:
此枚举器绑定的列表已被修改。只有在列表没有更改时才能使用枚举器。
答案 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();
}
}
}