【问题标题】:c# - ArgumentOutOfRangeException: Index was out of range - 2 Formsc# - ArgumentOutOfRangeException: Index was out of range - 2 Forms
【发布时间】:2013-04-06 04:04:58
【问题描述】:

问题解决了。

原来的“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# 的新手,因此对任何看似明显的错误或糟糕的编码表示歉意。

我正在尝试创建一个新专辑对象(从 FormAlbumAC 上的 NameTextBox.Text 获取其名称),并在用户单击 FormAlbumAC 上的保存按钮时将其添加到 List AlbumList 中。然后我想在 FormMain 的 ListBox 中列出所有 AlbumList。

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

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

我不确定我做错了什么。任何帮助将不胜感激,谢谢。

FormFormMain:

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

【问题讨论】:

  • 你能在你声明MAX_ABUMS的地方发帖吗?
  • 就在FormMain的开头,不好意思,会加的。
  • 对,但我们需要看代码。该 for 循环中的条件语句是可疑的,我认为您的问题与您声明 MAX_ALBUMS 的内容有关。

标签: c#


【解决方案1】:

您的问题(来自您的 cmets)是您的 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 &lt; ....PublicVars.AlbumList.Count; i++)

第二个潜在问题是您可能会跳过索引 0。数组从索引 0 开始并继续索引 length-1。因此,您可能想要i++,而不是++i。不过,这取决于您的实施。

【讨论】:

  • 哦,对不起,错误实际上发生在下面的行。我复制了错误的行,但在它下面提到了正确的行。不过感谢您的建议,我已经做出了这些更改。
  • 这就是错误应该发生的地方,实际上。它应该被清除(不过,我正在修改我的答案。应该是 AlbumList 的长度减去 1。)
  • 好的,将“for (int i = 0; i
  • 你需要重新考虑你的条件和逻辑流向底部。
  • 我想要做的实际上是在列表中找到一个空空间。找到它后,我想用索引将其添加为书签并停止搜索。然后,现在索引不是-1,我想做“if(index!= -1){...}”中的所有东西。所以上面的解决方案意味着我实际上永远不会找到 null 对吗?
猜你喜欢
  • 2013-04-27
  • 1970-01-01
  • 1970-01-01
  • 2020-11-25
  • 1970-01-01
  • 2019-02-23
  • 1970-01-01
  • 2021-03-25
  • 2021-12-27
相关资源
最近更新 更多