2013-04-06 39 views
0

問題已解決。c# - ArgumentOutOfRangeException:索引超出範圍 - 2形式

原來的「私人無效buttonSave_Click」修改爲:

private void buttonSave_Click(object sender, EventArgs e) 
{ 
    if (MusicCollection.FormMain.PublicVars.AlbumList.Count != 100) 
    { 
     MusicCollection.FormMain.PublicVars.AlbumList.Add(new Album(NameTextBox.Text)); 

     MessageBox.Show("New Album added: " + NameTextBox.Text); 
     formMain.ListAlbums(formMain.AlbumsListBox.Items); 
     this.Close(); 
    } 
    else 
    { 
     MessageBox.Show("No room for new album."); 
     this.Close(); 
    } 
} 

原貼:

我是新來使用C#,所以appologies任何像樣明顯的錯誤或糟糕的編碼。

我試圖創建一個新的相冊對象(即從Form FormAlbumAC上的NameTextBox.Text獲取其名稱),並在用戶單擊FormAlbumAC上的保存按鈕時將其添加到List AlbumList。然後,我想列表FormMain上列表框中列出所有的AlbumList。

當我運行該程序,然後點擊保存按鈕,我得到錯誤「ArgumentOutOfRangeException是未處理的,指數超出範圍」在該行:

if (MusicCollection.FormMain.PublicVars.AlbumList[i] == null) 
// line 8 on my excerpt from Form FormAblumAC 

我不知道我是什麼做錯了。任何幫助將不勝感激,謝謝。

形式FormMain:

public const int MAX_ALBUMS = 100; 
public int totalAlbums = 0; 

public FormMain() 
    { 
     InitializeComponent(); 
    } 

public static class PublicVars 
{ 
    public static List<Album> AlbumList { get; set; } 

    static PublicVars() 
    { 
     AlbumList = new List<Album>(MAX_ALBUMS); 
    } 
} 

public ListBox AlbumListBox 
{ 
    get 
    { 
     return AlbumListBox; 
    } 
} 

public void ListAlbums(IList list) 
{ 
    list.Clear(); 
    foreach (var album in PublicVars.AlbumList) 
    { 
     if (album == null) 
      continue; 
     list.Add(album.Name); 
    } 
} 

形式FormAlbumAC:

private FormMain formMain; 

private void buttonSave_Click(object sender, EventArgs e) 
{ 
    int index = -1; 
    for (int i = 0; i < MusicCollection.FormMain.MAX_ALBUMS; ++i) 
    { 
     if (MusicCollection.FormMain.PublicVars.AlbumList[i] == null) 
     { 
      index = i; 
      break; 
     } 
    } 
    if (index != -1) 
    { 
     MusicCollection.FormMain.PublicVars.AlbumList[index] = new Album(NameTextBox.Text); 
     ++formMain.totalAlbums; 

     MessageBox.Show("New Album added: " + NameTextBox.Text); 
     formMain.ListAlbums(formMain.AlbumsListBox.Items); 
     this.Close(); 
    } 
    else 
    { 
     MessageBox.Show("No room for new album."); 
     this.Close(); 
    } 
} 
+0

你能發佈你聲明MAX_ABUMS的地方嗎? – Zyerah 2013-04-06 04:19:14

+0

在FormMain的開頭,很抱歉,會添加。 – user2251281 2013-04-06 04:20:28

+0

沒錯,但我們需要看代碼。 for循環中的條件語句是可疑的,我認爲你的問題與你聲明'MAX_ALBUMS'的東西有關。 – Zyerah 2013-04-06 04:21:11

回答

1

您的問題(從您的意見)是一個在for循環的條件是不正確。您的循環是這樣的:

for (int i = 0; i < MusicCollection.FormMain.MAX_ALBUMS; ++i) 

有一個問題,一個潛在的問題在這裏。首先,當這段代碼實際上是運行,它的真正運行:

for (int i = 0; i < 100; ++i) 

因爲MusicCollection.FormMain.MAX_ALBUMS被聲明爲100這將導致一個錯誤時的MusicCollection.FormMain.PublicVars.AlbumList的長度小於100,因爲你想抓住一個指數那不存在。

取而代之,您需要從i=0重複長度....PublicVars.AlbumList-1,或者最好是for(int i = 0; i < ....PublicVars.AlbumList.Count; i++)

第二個潛在問題是,你可能跳過索引0陣列索引零開始,並繼續指數length-1。因此,您可能需要i++,而不是++i。雖然,取決於你的實施。

+0

哦,對不起,錯誤實際上發生在下面的行。我複製了錯誤的行,但在其下面提到了正確的行。謝謝你的建議,但我做了這些改變。 – user2251281 2013-04-06 04:30:22

+0

這就是錯誤應該發生的地方,實際上。它應該被清除(我正在編輯我的答案,但應該是AlbumList減1的長度。) – Zyerah 2013-04-06 04:31:25

+0

好吧,已更改「for(int i = 0; i user2251281 2013-04-06 04:43:56