2013-04-06 3 views
0

문제가 해결되었습니다.C# - ArgumentOutOfRangeException : 인덱스가 범위를 벗어났습니다 - 2 양식

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

원래의 게시물 :

원래 "개인 무효 buttonSave_Click"

이 변경되었습니다

나는 C#을 사용하는 새로운 해요 어떤 알맞은 명백한 실수 나 끔찍한 코딩 appologies 때문에.

사용자가 FormAlbumAC에서 저장 버튼을 클릭하면 List AlbumList에 추가하는 새 Album 개체 (NameTextBox.Text에서 FormFormatACP의 이름을 가져옵니다)를 만들려고합니다. 그럼 FormMain의 ListBox에있는 모든 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

+0

FormMain 시작 부분에 미안하지만 추가됩니다. – user2251281

+0

맞지만 코드를 볼 필요가 있습니다. for 루프의 조건문은 의심스럽고, 여러분의 문제는 여러분이'MAX_ALBUMS'라고 선언 한 것과 관련이 있다고 생각합니다. – Zyerah

답변

1

귀하의 문제는 당신을위한 루프의 조건이 잘못된 것입니다. for 루프는 다음과 같습니다.

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

하나의 문제점과 잠재적 인 문제점이 있습니다. 당신이 인덱스를 잡으려고 노력하고 있기 때문에, MusicCollection.FormMain.PublicVars.AlbumList의 길이가 100 미만 때 MusicCollection.FormMain.MAX_ALBUMS가 100로 선언이 오류가 발생

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

때문에 첫째,이 코드가 실제로 때 정말 실행의 실행 존재하지 않습니다.

대신 i=0에서 ....PublicVars.AlbumList-1까지 또는 바람직하게는 for(int i = 0; i < ....PublicVars.AlbumList.Count; i++) 길이에서 반복해야합니다.

두 번째 잠재적 인 문제는 잠재적으로 인덱스 0을 건너 뛰는 것입니다. 배열은 인덱스 0에서 시작하여 인덱스 length-1을 계속합니다. 따라서 i++ (++i이 아님)을 원할 수도 있습니다. 그러나 구현에 따라 다릅니다.

+0

아, 죄송합니다. 오류는 실제로 아래 줄에서 발생합니다. 나는 잘못된 선을 복사했지만 그 아래에 오른쪽 선을 언급했다. 조언을 주셔서 감사합니다, 나는 그 변화를 만들었습니다. – user2251281

+0

실제로 오류가 발생해야합니다. 그것은 지워야한다 (나는 나의 대답을 편집하고있다. AlbumList의 길이에서 1을 뺀 것) – Zyerah

+0

"for (int i = 0; i user2251281

관련 문제