Pergunta

Estou tentando percorrer um banco de dados de nomes de álbuns usando o ListView. Quando seleciono inicialmente um álbum, o _SelectedIndexchanged retorna o álbum apropriado; No entanto, nas tentativas subsequentes de selecionar um álbum, o ListView retorna um sistema.argumentoutOfRangeException - invalidargument = valor de '0' não é válido para 'índice'. Alguém poderia me orientar na direção certa sobre o que pode ser feito para evitar esse erro?

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());
   }
Foi útil?

Solução

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

Outras dicas

O erro indica que o manipulador de eventos disparou enquanto não havia itens selecionados, então sua chamada para o álbum [0] falhou, pois não havia itens. Verifique se a propriedade Count of Albumis maior que zero antes de exibir sua caixa de mensagem.

É porque, nos bastidores, o evento de alteração do índice selecionado é realmente chamado três vezes na troca de um item para outro. O primeiro item A é selecionado, depois nenhum item, depois o item B. Uma contagem dos itens indexados referenciados é mantida em cada estágio. Na etapa intermediária, a contagem de índices é 0 e, portanto, não há nada a referência na verificação do índice. Tentando consultar ele retorna o erro. Verificando a contagem pula naquela etapa do meio.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top