2010-08-27 10 views
5

Ho una piccola applicazione WinForms C# 3.5 su cui sto lavorando che cattura i nomi dei registri eventi da un server in un listview. Quando uno di questi elementi è selezionato, un altro listview viene popolato con le voci del registro eventi dal registro eventi selezionato utilizzando l'evento SelectedIndexChanged afferrando la proprietà text del primo elemento nell'insieme SelectedItems come mostrato di seguito.ListView SelectedIndexChanged Evento no Selected Items problem

string logToGet = listView1.SelectedItems[0].Text; 

Questo funziona correttamente la prima volta, ma una seconda selezione di un nome registro eventi dal primo listview non riesce. Quello che sta succedendo è la raccolta SelectedItems che sta ottenendo l'evento SelectedIndexChanged è vuota, quindi ottengo ArgumentOutOfRangeException.

Sono in perdita. Qualche idea su ciò che sto facendo male o un modo migliore per farlo?

risposta

12

Sì, il motivo è che quando si seleziona un altro elemento, ListView deseleziona l'oggetto Selected prima di selezionare il nuovo elemento, quindi il conteggio passerà da 1 a 0 e quindi nuovamente a 1. Un modo per risolverlo sarebbe controllare che la raccolta SelectedItems contenga un elemento prima di provare a utilizzarlo. Il modo in cui si sta facendo va bene, è solo bisogno di prendere in considerazione questo

esempio

if (listView1.SelectedItems.Count == 1) 
{ 
    string logToGet = listView1.SelectedItems[0].Text; 
} 
1

Si dovrebbe controllare che la raccolta SelectedItems ha valori in esso prima di provare a recuperare i valori da esso.

Qualcosa di simile:

if(listView1.SelectedItems.Count > 0) 
    //Do your stuff here 
0

Quando si seleziona un nuovo elemento, la voce precedente non è selezionata prima. Avvolgi il tuo codice in un rapido controllo:

if(listView1.SelectedItems.Count > 0) 
{ 
string logToGet = listView1.SelectedItems[0].Text; 
} 

Questo ignorerà le voci selezionate che non cambiano in nessun elemento selezionato.