我正在尝试在C#中删除列表框中的空项

时间:2010-06-26 21:51:59

标签: c# listbox

所以我想删除列表框中的空白项目,就像空白一样,所以我有这个代码。但是编译器给了我一个错误

for (int i = 0; i < listBox2.Items.Count; i++)
{
    if (listBox2.Items[i].ToString = " "){//ERROR*
        listBox2.Items.RemoveAt(i);
    }
}

*无法将方法组'ToString'转换为非委托类型'bool'。你打算调用这个方法吗?

5 个答案:

答案 0 :(得分:9)

ToString是一种方法,因此您需要它ToString(),并且使用两个等号[{1}}执行相等比较,而不是一个。一个等号是分配。

话虽如此,要迭代你的收藏并按索引删除项目,你会想要反过来。您会注意到,当您移除项目时,您的项目数量将明显下降,因此您的循环将不会像您认为的那样。所以去做这样的事情:

==

答案 1 :(得分:3)

仅在列表框中删除所有空项目(行)。使用VS 2003 framework 1.1或VS 2005 framework 2.0或VS 2008 framework 3.5,此代码适用于您:

int i = 0;
while (listBox1.Items.Count - 1 >= i)
{
// convert listbox object to string so we can use Trim() for remove all space(whitespace char before and after the word 
//then check if remain character or there is nothing at all whatever whitspace char or any space

  if (Convert.ToString(listBox1.Items[i]).Trim() == string.Empty)
  {
   //if the line became blank after Trim() apply so the line is empty and condition is true
   listBox1.Items.RemoveAt(i);
   //decrement i because we remove line and the following line will take his place and his index number
   i -= 1;
   }
 i += 1;
}

请记住,如果单击新空白行中的空格键或制表符,则会创建字符调用空白字符,而不是空行。

如果我们将以下行添加到列表框

,请理解我的意思
            listBox1.Items.Add("    IN  ");//click tab before and after IN
            listBox1.Items.Add("");        //blank line no whitespace char or any character
            listBox1.Items.Add("  THE");   //click spacebar twice before THE
            listBox1.Items.Add("    ");    //click tab once
            listBox1.Items.Add(" NAME ");  //click spacebar after and before
            listBox1.Items.Add("    OF "); //click tab before and spacebar after 
            listBox1.Items.Add("        ");//click tab twice
            listBox1.Items.Add("ALLAH");   //no space after or before

唯一符合条件String.Empty而不适用Trim()的行是第2行,但当我们使用Trim()第4行和第7行时,它们就像第2行空白行没有空白字符所以第2个(已空行或空行无需修改),第4个,第7个(现在在使用修剪后变为空白行),它们将从列表框中删除。

结果将是:

  IN 
  THE
  NAME 
  OF 
  ALLAH

答案 2 :(得分:2)

尝试

if (String.IsNullOrWhiteSpace(listBox2.Items[i].ToString())){

然而!由于您要删除项目,这意味着枚举器将无法正常工作。如果您的列表框项目是

  • “一”
  • “”
  • “B”

然后您的代码将:

  • 保持一个。 (索引0)
  • 删除“”。 (索引1,“b”成为新索引1)
  • 抛出IndexOutOfRangeException。 (因为没有第2项)

相反,请尝试

List<int> itemsToRemove = new List<int>(); // using System.Collections.Generic
for (int i = 0; i <= listBox2.Items.Count; i++)
{
    if (String.IsNullOrWhiteSpace(listBox2.Items[i].ToString())){
        itemsToRemove.Append(i);
    }
}
foreach (int i in itemsToRemove){
    listBox2.Items.RemoveAt(i);
}

答案 3 :(得分:0)

你应该试试这个

> for (int i = 0; i <= listBox2.Items.Count; i++)
>               {
>                   if (listBox2.Items[i].ToString() == "") //Remove ' ' space
>                       listBox2.Items.RemoveAt(i);
>                   }
>               }

答案 4 :(得分:0)

看起来你是个VB人。 在基于C语言(如C#)中,(与VB不同)有两个不同的运算符用于分配东西和检查东西(我不知道真正的术语)。要检查两个东西是否相等,请使用double =(==)。那么你在if语句中所做的就是为列表框项目分配“”。这显然不会返回一个布尔值(如果需要的话)。在pre-c#语言中,这可能导致真正难以发现的错误,因为没有警告。

在VB中,您可以在不使用括号的情况下调用方法。在c#中,总是需要它们。编译器会认为您希望将方法的地址存储在委托中,如果将其遗漏(例如在VB.Net中使用AddressOf)。当你做出这两个改变时(事实上,就像安东尼·佩格拉姆所说的那样向后循环),一切都会好起来的。