2016-11-02 67 views
4

我有一個組合框,其中包含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); 
    } 
} 
+2

您是否嘗試過調試應用程序?在發生錯誤的行上放置一個斷點 - 然後檢查「i」的值。 –

+3

您正在循環外使用循環變量('i')。這很少是一個好主意。你認爲'我'有什麼價值?在循環之後? – MAV

回答

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

您正在使用相同的變量(i)進行範圍計算和賦值。 試試這個。因爲在最後的循環的for循環i遞增1發生

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); 

      } 
     } 
+0

如果找不到匹配項會發生什麼情況?它不再拋出異常,但行爲現在是否正確?如果學生列表爲空,會發生什麼? –

6

錯誤:

i++ 

然後,它計算爲false在表達式:

i < Main.studentList.Count 

所以當你到達發生錯誤的那一行I等於Main.studentList.Count,所以發生索引超出範圍的錯誤。

如果要訪問列表的最後一個元素,你可以這樣做:如果你要評估在每次循環語句只是將它你在for循環中

Main.studentList[Main.studentList.Count - 1].StudentName 

或者:

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保留在循環範圍內的優勢。

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; 
     } 
    } 
}