自分自身をパスワード マネージャーにしているのですが、コードの一部で問題が発生しています。アプリケーションが xml ファイルを開き、その xml ドキュメント (アカウント) に含まれる項目をリストビューに入力することが想定されています。リストビューを右クリックすると、さまざまなオプションのコンテキスト メニューが表示され、それらはすべて個別に正常に機能します。ただし、xml ドキュメントを開いてリストビューからアカウントの 1 つを削除し、別のアカウントを追加しようとすると、次のメッセージがスローされます。
ArgumentOutOfRangeException unhandled.
InvalidArgument=Value of '4' is not valid for 'index'.
Parameter name: index
リストビューからアカウントを削除すると、アプリケーションの起動時に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;
}
}
最後に、アカウントを削除するためのセグメント:
private void removeSelectedAccountToolStripMenuItem_Click(object sender, EventArgs e)
{
listView1.Items.Remove(listView1.SelectedItems[0]);
}
ここでも、次のシーケンスが実行されるまで、すべて正常に機能します。アカウント ファイルが開かれました --> アカウントが削除されました --> 別のアカウントが追加されました。その時点で例外がスローされ、新しいアカウントがリスト ビューに追加されることはありません。
例外の詳細は次のとおりです。これは「スタックダンプ」ですか?
System.ArgumentOutOfRangeException が処理されませんでした Message=InvalidArgument=「3」の値は「インデックス」には無効です。 パラメータ名:インデックス ソース=System.Windows.Forms ParamName=インデックス スタックトレース: 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 (オブジェクト送信者、EventArgs e) で