c# - ArgumentOutOfRangeException:索引超出范围 - 2个表单

时间:2013-04-06 04:04:59

标签: c#

问题解决了。

原来的“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对象(从Form FormAlbumAC上的NameTextBox.Text获取其名称),并在用户单击FormAlbumAC上的保存按钮时将其添加到List AlbumList。然后我想列出Form FormMain上的ListBox中的所有AlbumList。

当我运行程序并单击保存按钮时,我收到错误“ArgumentOutOfRangeException未处理,索引超出范围”的行:

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

我不确定我做错了什么。非常感谢任何帮助,谢谢。

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

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

1 个答案:

答案 0 :(得分:1)

您的问题(来自您的评论)是您的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。但是取决于你的实施。