使用foreach和counter变量循环到ListView时ArgumentOutOfRangeException?

时间:2016-09-25 02:32:20

标签: c# foreach

我有一个多选OpenFileDialog,它循环遍历多个文件中的每一行并保持计数,以便通过Index执行特定的工作。当加载多个文件时,如何阻止它给我一个ArgumentOutOfRangeException? Listview已经将项目和子项集合填充到两个额外的标题中。合并的两个文件只会将大约6个项目加载到列[1]中。

    public void LoadStudents()
    {            
        var ofdLoadStudents = new OpenFileDialog();
        ofdLoadStudents.Multiselect = true;
        int Counter = 0;

        if (ofdLoadStudents.ShowDialog() == DialogResult.OK)
        {
            foreach (string studentList in ofdLoadStudents.FileNames)
            {
                foreach (string Students in File.ReadAllLines(studentList))
                {
                    //[Period 1]         | [ReadAllLines Data]
                    //listview already populated with 10 items, and subitems with "" as the item.
                    //only loading total of 6 lines with 2 files, into [1] column.
                    listViewStudents.Items[Counter].SubItems[1].Text = Students;
                    Counter++;
                }
            }
        }
    }

1 个答案:

答案 0 :(得分:1)

尝试访问集合外部的元素时,可能会导致“ArgumentOutOfRangeException”。例如,假设你有一个包含5个整数的List。现在,假设您尝试访问元素7.没有元素7,因此您将获得ArgumentOutOfRangeException。

我在上面的代码中看到的两个地方可能会导致此问题,并且它们都在同一行:

listViewStudents.Items[Counter].SubItems[1].Text = Students;

第一个问题位置是listViewStudents.Items [Counter]部分。 listViewStudents中的Items对象是一个集合,在访问它们之前必须先添加对象。如果您没有向“Items”添加任何对象,或者您的Counter变量太大,您将尝试访问不存在的Items对象的元素,因此您将收到错误。这是我认为最有可能出现问题的地方。你在哪里添加项目到listViewStudents.Items集合?它在你的代码中的其他地方吗?在尝试访问元素之前,请确保已初始化。另外,如果要在代码中的其他位置添加它们,您如何知道正在读取的文本文件中的行数不超过Items集合中的元素数?这些是您在处理任何类型的集合时需要考虑的事项。

第二个问题位置在SubItems [1]部分。 SubItems也是一个集合,如果它没有用至少两个元素初始化(你通过调用SubItems [1]访问第二个元素,它从SubItems [0]开始),那么你也会得到一个ArgumentOutOfRangeException。

所以你的问题不在于你的foreach循环,它们看起来很好。

编辑:

我很快写了一些代码来实现我认为你想要做的事情。您是否正在尝试读取学生姓名列表并将其添加到WinForm ListView控件中?如果是这样,这段代码就会这样做。

public void LoadStudents()
    {
        var ofdLoadStudents = new OpenFileDialog();
        ofdLoadStudents.Multiselect = true;
        int Counter = 0;

        if (ofdLoadStudents.ShowDialog() == DialogResult.OK)
        {
            foreach (string studentList in ofdLoadStudents.FileNames)
            {
                foreach (string Students in File.ReadAllLines(studentList))
                {
                    //[Period 1]         | [ReadAllLines Data]
                    //has about 10 items | all "" fields.
                    //only loading total of 6 lines with 2 files combined.
                    listViewStudents.Items.Add(new ListViewItem(new string[] { Counter.ToString(), Students })); //This is the new code
                    Counter++;
                }
            }
        }
    }

这将导致listView显示一系列数字0,1,2 ......直到文本文件中的行数。

如果您想显示学生姓名,请翻转数组中的Students和Counter.ToString()元素。

listViewStudents.Items.Add(new ListViewItem(new string[] { Counter.ToString(), Students }));