C#删除列表框

时间:2017-03-26 09:12:12

标签: c# winforms listbox

我将一些文件添加到按钮上的列表框中:

if (Directory.Exists(DirString))
{
DirectoryInfo dirETC = new DirectoryInfo(DirString);
FileInfo[] Files = dirETC.GetFiles("*.txt");
foreach (FileInfo file in Files)
{
    listBox1.Items.Add(file.FullName);
}

如果用户点击删除按钮,我想删除列表框中的所有文件,如下所示:

try
{
    listBox1.BeginUpdate();

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

            if (File.Exists(filename))
            {
                File.Delete(filename);
                listBox1.Items.Remove(filename);
            }
        }
    listBox1.EndUpdate();
}
catch (Exception)
{
    return;
}

以上代码有效,但每次点击全部删除按钮时,它只删除一个文件。我想我需要在这里添加一些foreach循环来迭代这些项目,但我不确定最好的方法是什么。

3 个答案:

答案 0 :(得分:3)

Foreach语句不允许您修改正在迭代的集合,而for则会。您只需要小心索引:在删除第一个项目(索引= 0)后的解决方案中,下一个项目成为第一项。请尝试这种方法:

listBox1.BeginUpdate();

for (int i = listBox1.Items.Count - 1; i >=0; i--)
{
    string filename = listBox1.Items[i].ToString();

    if (File.Exists(filename))
    {
        try
        {
            File.Delete(filename);
            listBox1.Items.Remove(filename);
        }
        catch (Exception)
        {
        }
    }
}
listBox1.EndUpdate();

答案 1 :(得分:2)

当您从使用for..next语句迭代的数组中删除项时,您应该考虑每次删除元素时,一个元素的数组计数减少,并且数组中的每个元素都会移位较低的指数。因此,当您删除索引0处的元素时,位于索引1的前一个元素在位置0处移位,但您已经遍历索引零,因此您跳过该元素并尝试删除索引处的元素在删除索引0处的项目之前2。

解决方案很简单。以相反的顺序循环(从最高元素到最低元素)

for (int i = listBox1.Items.Count-1; i >= 0 ; i--)
{
    string filename = listBox1.Items[i].ToString();
    if (File.Exists(filename))
    {
        File.Delete(filename);
        listBox1.Items.Remove(filename);
    }
}

答案 2 :(得分:1)

将列表框的内容复制到字符串数组中,以防止在循环中从列表框中删除项目时出错。

// Copy the contents of the listbox into a string array
string[] filenameList = listBox1.Items.OfType<string>().ToArray();
try
{
    for (int i = 0; i < filenameList.Length; i++)
    {
        string filename = filenameList[i];
        if (File.Exists(filename))
        {
            File.Delete(filename);
            listBox1.Items.Remove(filename);
        }
    }

}
catch (Exception)
{

}