当使用foreach和counter变量循环进入ListView时,出现ArgumentOutOfRangeExcept

本文关键字:ListView ArgumentOutOfRangeExcept 出现 循环 foreach 变量 counter | 更新日期: 2023-09-27 18:08:35

我有一个多选OpenFileDialog,它通过多个文件中的每一行循环并保持计数,以便通过索引执行特定的工作。我如何阻止它在加载超过1个文件时给我一个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++;
                }
            }
        }
    }

当使用foreach和counter变量循环进入ListView时,出现ArgumentOutOfRangeExcept

当试图访问集合外的元素时,可能会导致"ArgumentOutOfRangeException"。例如,假设你有一个包含5个整型数的List。现在,假设你尝试访问元素7。没有元素7,所以您将得到一个ArgumentOutOfRangeException。

在上面的代码中,我看到有两个地方可能会导致这个问题,它们都在同一行:
listViewStudents.Items[Counter].SubItems[1].Text = Students;

第一个问题位置是listViewStudents。项目(计数器)的部分。listViewStudents中的Items对象是一个集合,必须在访问它们之前添加对象。如果你没有添加任何对象到"Items",或者如果你的Counter变量变得太大,你将尝试访问不存在的Items对象的元素,所以你会得到错误。这就是我认为最可能的问题所在。在哪里添加项目到listViewStudents。收藏物品?是在代码的其他地方吗?确保在尝试访问元素之前对其进行初始化。此外,如果您在代码的其他地方添加它们,您如何知道您正在读取的文本文件中的行数不会超过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 }));