繁体   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