簡體   English   中英

C#-ArgumentOutOfRangeException:索引超出范圍-2種形式

[英]c# - ArgumentOutOfRangeException: Index was out of range - 2 Forms

問題解決了。

原始的“私有無效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#的新手,因此對於任何看似明顯的錯誤或糟糕的編碼來說,它都是應用程序。

我試圖創建一個新的相冊對象(從FormFormAlbumAC上的NameTextBox.Text獲取其名稱),並在用戶單擊FormAlbumAC上的保存按鈕時將其添加到List AlbumList。 然后,我想在FormFormMain的列表框中列出所有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();
    }
}

您的問題(根據您的評論)是您的for循環條件不正確。 您的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。數組從索引0開始並繼續到length-1 因此,您可能需要i++而不是++i 但是,取決於您的實現。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM