C #: как исправить это ArgumentOutofRangeExeception? - PullRequest
2 голосов
/ 22 мая 2011

Создаю себе менеджер паролей, и у меня возникают некоторые проблемы с сегментом кода.Предполагается, что приложение открывает XML-файл, а затем заполняет список с элементами, содержащимися в этом XML-документе (учетные записи).Щелчок правой кнопкой мыши по списку дает контекстное меню для различных опций, каждый из которых отлично работает по отдельности.Тем не менее, после открытия документа XML, а затем удалить одну из учетных записей из списка, а затем попытаться добавить другую учетную запись, он выдает следующее:

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

Я предполагаю, что происходит неправильно, когда яудалить учетную запись из списка, я испортил счетчик переменной индекса, которая увеличивается для каждого элемента в XML-документе при запуске приложения.Не уверен, что лучший способ исправить это, не нарушая другие части кода.Я думал о том, чтобы сбросить значение «index» после удаления учетной записи, подсчитав, сколько всего элементов теперь в listView, но не уверен, что это лучше.Вот как выглядит код при открытии 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 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

1 Ответ

5 голосов
/ 23 мая 2011

Поскольку index не объявлено ни в одном из методов, которые я видел, я предполагаю, что это член класса. При добавлении учетных записей вы всегда увеличиваете index, но при их удалении оно остается прежним. Поэтому после удаления учетной записи в вашем ListView будет меньше элементов, чем предлагает index.

Исправить просто. Избавиться от index. Похоже, вы все равно его не используете. В цикле foreach измените использование ListView.Items.Insert на ListView.Items.Add.

...