2

リストビューがあり、ボタンを押して選択したアイテムを削除したい。さらに、私はアイテムを他のいくつかのアクションに使用します。基本的に、アイテムの文字列のいくつかの文字を使用してファイルと一致させ、それを削除します。これは、選択した項目がリストビューの最初の項目である場合に機能しますが、2 番目、3 番目などの場合は機能しません。

private void delete_button_Click(object sender, EventArgs e)
{
  for (int i = 0; i < listView1.Items.Count; i++)
    {
    if (listView1.Items[i].Selected)
      {
        string var1 = listView1.SelectedItems[i].ToString(); //error
        string var2 = var1.Substring(31, 5); 
        ... // code for other actions
        listView1.Items[i].Remove();
        i--;
      }
    }
 }

エラーが発生します

ArgumentOutofRangeException は処理されませんでした" - 無効な引数値 '1' は 'index' には無効です

何が問題なのか、最初の項目の場合にのみ機能する理由がわかりません。

4

8 に答える 8

2

選択された項目には選択された項目のみが含まれていますが、コレクション全体を反復処理しています。

  for (int i = 0; i < listView1.Items.Count; i++)
    {
    if (listView1.Items[i].Selected)
      {
        string var1 = listView1.Items[i].ToString();  // <-------
        string var2 = var1.Substring(31, 5); 
        ... // code for other actions
        listView1.Items[i].Remove();
        i--;
      }
    }
于 2013-08-21T10:23:30.647 に答える
0

選択したものだけを含むコレクションがある場合、なぜすべての要素を反復するのですか?

これを行うだけです。

    foreach(var var1 in listView1.SelectedItems.ToArray())
    //the to array is to create e new collection from the list else you get one error when you change it.
    {
        string var2 = var1.Substring(31, 5); 
        ... // code for other actions
        listView1.Items.Remove(var1);
    }
于 2013-08-21T10:30:30.703 に答える
0

これを試して;

 for (int i = listView1.Items.Count-1; i >=0 ; i--)
    {
    if (listView1.Items[i].Selected)
      {
        string var1 = listView1.SelectedItems[i].ToString(); //error
        string var2 = var1.Substring(31, 5); 
        ... // code for other actions
        listView1.Items[i].Remove();

      }
    }
于 2013-08-21T10:30:54.297 に答える