ListView возвращает InvalidArgument = значение '0' - исключение вне диапазона - PullRequest
1 голос
/ 11 мая 2010

Я пытаюсь прокрутить базу данных имен альбомов с помощью 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());
   }

Ответы [ 3 ]

2 голосов
/ 11 мая 2010
   private void listView1_SelectedIndexChanged(object sender,EventArgs e)
   {
      ListView.SelectedListViewItemCollection album = this.listView1.SelectedItems;
      if(album.Count>0)
         MessageBox.Show(album[0].ToString());
   }
1 голос
/ 11 мая 2010

Это потому, что за кулисами выбранное событие изменения индекса фактически вызывается три раза при переключении с одного элемента на другой. Сначала выбирается элемент A, затем нет элемента, затем элемент B. На каждом этапе ведется подсчет ссылочных индексированных элементов. На промежуточном этапе счетчик индекса равен 0, и поэтому нет ничего, на что можно ссылаться при проверке индекса. Попытка обратиться к нему возвращает ошибку. Проверка количества пропускает этот средний шаг.

1 голос
/ 11 мая 2010

Ошибка указывает на то, что обработчик событий сработал, хотя не было выбрано ни одного элемента, поэтому ваш вызов в альбом [0] не удался, так как не было никаких элементов. проверьте, не является ли свойство count альбома больше нуля, прежде чем открывать окно сообщения.

...