1

我正在尝试使用 ListView 滚动浏览专辑名称数据库。当我最初选择一个专辑时,_SelectedIndexChanged 返回相应的专辑;但是,在随后尝试选择专辑时,ListView 返回 System.ArgumentOutOfRangeException - InvalidArgument=“0”的值对“索引”无效。有人可以引导我朝着正确的方向前进,可以采取哪些措施来避免这个错误?

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

该错误表明事件处理程序在未选择任何项目时触发,因此您对专辑 [0] 的调用失败,因为没有项目。在弹出消息框之前检查专辑的计数属性是否大于零。

于 2010-05-10T20:32:34.940 回答
1

这是因为,在幕后,在从一个项目切换到另一个项目时,实际上调用了 3 次选定的索引更改事件。第一个项目 A 被选中,然后没有项目,然后是项目 B。在每个阶段维护引用的索引项目的计数。在中间步骤中,索引计数为 0,因此在索引检查中没有可参考的内容。试图引用它会返回错误。检查计数会跳过该中间步骤。

于 2010-05-11T10:53:06.993 回答