0

問題が解決しました。

元の「private void 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# を使用するのが初めてなので、一見明らかな間違いやひどいコーディングをお詫びします。

新しい Album オブジェクト (フォーム FormAlbumAC の NameTextBox.Text から名前を取得する) を作成し、ユーザーが FormAlbumAC の保存ボタンをクリックすると、List AlbumList に追加しようとしています。次に、フォーム FormMain の ListBox に AlbumList のすべてを一覧表示します。

プログラムを実行して保存ボタンをクリックすると、次の行で「ArgumentOutOfRangeException was unhandled, Index was out of range」というエラーが表示されます。

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

何が間違っているのかわかりません。どんな助けでも大歓迎です、ありがとう。

フォーム フォームメイン:

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

1 に答える 1

1

あなたの問題 (コメントから) は、 for ループの条件が正しくないことです。for ループは次のとおりです。

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

ここには 1 つの問題と 1 つの潜在的な問題があります。まず、このコードを実際に実行すると、実際に実行されます。

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

は 100 として宣言されているためです。存在しないインデックスを取得しようとしているためMusicCollection.FormMain.MAX_ALBUMS、 の長さが 100 未満の場合にエラーが発生します。MusicCollection.FormMain.PublicVars.AlbumList

代わりに、 から、またはできればi=0の長さまで反復する必要があります。....PublicVars.AlbumList-1for(int i = 0; i < ....PublicVars.AlbumList.Count; i++)

2 つ目の潜在的な問題は、インデックス 0 をスキップする可能性があることです。配列はインデックス 0 から始まり、 index まで続きますlength-1。そのため、おそらくi++ではなくが必要です++i。ただし、実装によって異なります。

于 2013-04-06T04:25:55.810 に答える