1

ListView を使用してアルバム名のデータベースをスクロールしようとしています。最初にアルバムを選択すると、_SelectedIndexChanged は適切なアルバムを返します。ただし、その後アルバムを選択しようとすると、ListView は System.ArgumentOutOfRangeException を返します - InvalidArgument='0' の値は 'index' に対して有効ではありません。このエラーを回避するために何ができるかについて、誰かが私を正しい方向に導いてくれませんか?

private void ScrollThroughAlbums()
    {
      string selectStatement = "SELECT * FROM Albums ORDER BY Artist";
      OleDbCommand selectCommand = new OleDbCommand(selectStatement, oleDatabaseConnectionString);
      OleDbDataReader myReader = selectCommand.ExecuteReader();
      ColumnHeader columnHeader1 = new ColumnHeader();
      ColumnHeader columnHeader2 = new ColumnHeader();
      ColumnHeader columnHeader3 = new ColumnHeader();

      columnHeader1.Text = "Album";
      columnHeader2.Text = "Artist";
      columnHeader3.Text = "Tracks";

      listView1.Columns.Add(columnHeader1);
      listView1.Columns.Add(columnHeader2);
      listView1.Columns.Add(columnHeader3);
      listView1.Columns[0].Width=130;
      listView1.Columns[1].Width=130;

      listView1.View = View.Details;
      listView1.AllowColumnReorder=true;
      listView1.FullRowSelect=true;
      listView1.GridLines=true;
      listView1.MultiSelect = false;
      listView1.Sorting= SortOrder.Ascending;

      while (myReader.Read())
      {
         string frontCoverXML = myReader.GetString(3).ToString();
         string Artist = myReader.GetString(1).ToString();
         string Album = myReader.GetString(2).ToString();
         string TracksXML = myReader.GetString(4).ToString();
         ListViewItem item = new ListViewItem(new []{Album,Artist}); 
         listView1.Items.Add(item); 

        } myReader.NextResult();
        myReader.Close();
    }

   private void listView1_SelectedIndexChanged(object sender,EventArgs e)
   {
      ListView.SelectedListViewItemCollection album = this.listView1.SelectedItems;
      MessageBox.Show(album[0].ToString());
   }
4

3 に答える 3

2
   private void listView1_SelectedIndexChanged(object sender,EventArgs e)
   {
      ListView.SelectedListViewItemCollection album = this.listView1.SelectedItems;
      if(album.Count>0)
         MessageBox.Show(album[0].ToString());
   }
于 2010-05-10T20:33:43.200 に答える
1

このエラーは、項目が選択されていないときにイベント ハンドラーが発生したことを示しているため、項目がなかったため、album[0] への呼び出しが失敗しました。メッセージ ボックスを表示する前に、アルバムの count プロパティが 0 より大きいかどうかを確認してください。

于 2010-05-10T20:32:34.940 に答える
1

これは、バックグラウンドで、選択されたインデックス変更イベントが、ある項目から別の項目への切り替えで実際に 3 回呼び出されるためです。最初にアイテム A が選択され、次にアイテムが選択されず、次にアイテム B が選択されます。参照されるインデックス付きアイテムの数は、各段階で維持されます。中間ステップでは、インデックス カウントは 0 であるため、インデックス チェックで参照するものはありません。参照しようとすると、エラーが返されます。カウントをチェックすると、その中間ステップがスキップされます。

于 2010-05-11T10:53:06.993 に答える