我有一个包含来自studentList的学生的组合框。当我选择学生时,它应该填写学生姓名的文本字段。每当从组合框中选择学生时,我都会收到以下错误
ArgumentOutOfRangeException was unhandled
Index was out of range. Must be non-negative and less than the size of the collection.
我认为问题可能在我的循环中,但我无法找到如何解决错误,任何帮助将不胜感激
private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
int i;
for (i = 0; i < Main.studentList.Count; i++)
{
if (comboBox1.SelectedItem == Main.studentList[i].StudentName + " " + Main.studentList[i].StudentId)
{
break;
}
}
txtName.Text = Main.studentList[i].StudentName; //where the error occurs
}
public void ChangeStudent_Load(object sender, EventArgs e)
{
//loading combobox from studentList
foreach (var student in Main.studentList)
{
comboBox1.Items.Add(student.StudentName + " " + student.StudentId);
}
}
答案 0 :(得分:7)
它抛出错误的原因是在休息之后,我会增加。如果我是列表中的最后一项,它现在已经超出界限了。如果不是,它现在指向下一个项目。
简单的解决方案是移动将错误抛到休息之上的行;
private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
int i;
for (i = 0; i < Main.studentList.Count; i++)
{
if (comboBox1.SelectedItem == Main.studentList[i].StudentName + " " + Main.studentList[i].StudentId)
{
txtName.Text = Main.studentList[i].StudentName;
break;
}
}
}
另外,考虑使用foreach循环。这是与foreach循环完全相同的逻辑。它使它更具可读性。
private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
foreach (var student in Main.studentList)
{
if (comboBox1.SelectedItem == student.StudentName + " " + student.StudentId)
{
txtName.Text = student.StudentName;
break;
}
}
}
答案 1 :(得分:6)
发生错误是因为for循环中的最后一个循环i
增加了1:
i++
然后在表达式中评估为false:
i < Main.studentList.Count
因此,当您到达发生错误的行时I
等于Main.studentList.Count
,因此会发生索引超出范围错误。
如果您想访问列表的最后一个元素,您可以这样做:
Main.studentList[Main.studentList.Count - 1].StudentName
或者,如果你想评估每个循环上的语句,只需将它移到for循环中:
for (int i = 0; i < Main.studentList.Count; i++)
{
if (comboBox1.SelectedItem == Main.studentList[i].StudentName + " " + Main.studentList[i].StudentId)
{
txtName.Text = Main.studentList[i].StudentName;
break;
}
}
这还有一个优点,就是将变量i
保持在循环范围内。
答案 2 :(得分:3)
更改您的代码,请再试一次
private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
int i;
for (i = 0; i < Main.studentList.Count; i++)
{
if (comboBox1.SelectedItem == Main.studentList[i].StudentName + " " + Main.studentList[i].StudentId)
{
txtName.Text = Main.studentList[i].StudentName;
break;
}
}
}
答案 3 :(得分:1)
您正在使用相同的变量(i)进行范围计算和分配。 试试这个。
private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
int j;
for (int i = 0; i < Main.studentList.Count; i++)
{
if (comboBox1.SelectedItem == Main.studentList[i].StudentName + " " + Main.studentList[i].StudentId)
{
j=i;
break;
}
}
txtName.Text = Main.studentList[j].StudentName; //where the error occurs
}
public void ChangeStudent_Load(object sender, EventArgs e)
{
//loading combobox from studentList
foreach (var student in Main.studentList)
{
comboBox1.Items.Add(student.StudentName + " " + student.StudentId);
}
}