当使用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++;
}
}
}
}
当试图访问集合外的元素时,可能会导致"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 }));