我有一个多选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++;
}
}
}
}
答案 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 }));