C#:如何解决这个ArgumentOutofRangeExeception?

Ste*_*ev0 2 c# listview outofrangeexception

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

 ArgumentOutOfRangeException unhandled.
 InvalidArgument=Value of '4' is not valid for 'index'.
 Parameter name: index
Run Code Online (Sandbox Code Playgroud)

我假设什么是错误的是当我从列表视图中删除帐户时,我搞乱了索引变量的计数,该变量在应用程序启动时为xml文档中的每个项目递增.不确定在不破坏其他代码部分的情况下解决问题的最佳方法.我想通过计算listView中现在有多少项目来删除帐户后重新设置'index'的值,但不确定这是否最佳.这是打开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;
        }
    }
Run Code Online (Sandbox Code Playgroud)

最后删除帐户的细分:

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

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

以下是例外细节.这是'堆栈转储'?

  System.ArgumentOutOfRangeException was unhandled
  Message=InvalidArgument=Value of '3' is not valid for 'index'.
Parameter name: index
  Source=System.Windows.Forms
  ParamName=index
  StackTrace:
       at System.Windows.Forms.ListView.ListViewItemCollection.Insert(Int32 index, ListViewItem item)
       at System.Windows.Forms.ListView.ListViewItemCollection.Insert(Int32 index, String text)
       at PassKeeper.Form1.addAccountToolStripMenuItem_Click(Object sender, EventArgs e) in C:\Users\Hamann\documents\visual studio 2010\Projects\PassMan\PassMan\Form1.cs:line 35

Mat*_*ira 5

既然index没有在我看到的任何方法中声明,我认为它是一个类成员.index添加帐户时总是递增,但删除帐户时,它会保持不变.因此,删除帐户后,您ListView的商品数量少于index建议数量.

修复很简单.摆脱index.无论如何,它看起来并不像你在使用它.在你的foreach循环改变你的使用ListView.Items.InsertListView.Items.Add.