【问题标题】:C#: How to fix this ArgumentOutofRangeExeception?C#:如何修复这个 ArgumentOutofRangeException?
【发布时间】:2011-05-22 19:54:58
【问题描述】:

让自己成为密码管理器,但我在一段代码中遇到了一些问题。应该发生的是应用程序打开一个 xml 文件,然后使用该 xml 文档(帐户)中包含的项目填充列表视图。右键单击列表视图会为各种选项提供一个上下文菜单,所有这些选项都可以单独工作。但是,打开 xml 文档后,然后从列表视图中删除一个帐户,然后尝试添加另一个帐户,它会抛出以下内容:

 ArgumentOutOfRangeException unhandled.
 InvalidArgument=Value of '4' is not valid for 'index'.
 Parameter name: index

我假设出了什么问题,当我从列表视图中删除帐户时,我弄乱了索引变量的计数,该变量在应用程序启动时为 xml 文档中的每个项目递增。不确定在不破坏其他代码部分的情况下修复该问题的最佳方法。我正在考虑在删除帐户后通过计算列表视图中现在有多少总项目来重置“索引”的值,但不确定这是否最好。这是打开 xml 时代码的样子。

private void openPasswordFileToolStripMenuItem_Click(object sender, EventArgs e)
    {
        System.Xml.XmlDocument loadDoc = new System.Xml.XmlDocument();

        try
        {
            loadDoc.Load(Application.StartupPath + "\\database.xml");
        }
        catch (System.IO.FileNotFoundException)
        {
            MessageBox.Show("Password Database does not exist!");
        }
        foreach (System.Xml.XmlNode node in loadDoc.SelectNodes("/Database/Account"))
        {
            lvItem = listView1.Items.Insert(index, node.Attributes["Description"].InnerText); ;
            lvItem.SubItems.Add(new ListViewItem.ListViewSubItem(lvItem, node.Attributes["Username"].InnerText)); ;
            lvItem.SubItems.Add(new ListViewItem.ListViewSubItem(lvItem, node.Attributes["Password"].InnerText)); ;
            index += 1;
        }
    }

最后是删除帐户的部分:

 private void removeSelectedAccountToolStripMenuItem_Click(object sender, EventArgs e)
    {
        listView1.Items.Remove(listView1.SelectedItems[0]);
    }

在执行以下序列之前一切正常:帐户文件已打开 --> 帐户已删除 --> 另一个帐户已添加。此时会引发异常,并且不会将新帐户添加到列表视图中。

以下是异常详情。这是“堆栈转储”?

 System.ArgumentOutOfRangeException 未处理
  Message=InvalidArgument='3' 的值对'index' 无效。
参数名称:索引
  源=System.Windows.Forms
  参数名称=索引
  堆栈跟踪:
       在 System.Windows.Forms.ListView.ListViewItemCollection.Insert(Int32 索引,ListViewItem 项)
       在 System.Windows.Forms.ListView.ListViewItemCollection.Insert(Int32 索引,字符串文本)
       在 C:\Users\Hamann\documents\visual studio 2010\Projects\PassMan\PassMan\Form1.cs:line 35 中的 PassKeeper.Form1.addAccountToolStripMenuItem_Click(Object sender, EventArgs e) 处

【问题讨论】:

  • 我会将大部分代码换成实际抛出的行和/或堆栈转储。

标签: c# listview outofrangeexception


【解决方案1】:

由于index 没有在我看到的任何方法中声明,我假设它是一个类成员。添加帐户时,您总是增加index,但删除它们时,它保持不变。因此,删除帐户后,您的 ListView 中的项目比 index 建议的要少。

修复很简单。摆脱index。无论如何,您似乎并没有经常使用它。在您的foreach 循环中,将您对ListView.Items.Insert 的使用更改为ListView.Items.Add

【讨论】:

  • 我实际上是使用索引变量来确定添加帐户的放置位置。 IE,对于列表中的每个项目,都会增加一,然后在相应索引处添加帐户列表中的下一行。我删除了它,它只是添加到列表的顶部,无论如何,不​​知道我为什么要这样做。感谢您指出。
猜你喜欢
  • 2022-11-20
  • 1970-01-01
  • 2020-08-24
  • 1970-01-01
相关资源
最近更新 更多