2010-10-08 35 views
4

J'ai un ListView en mode virtuel. Je veux accéder à la propriété SelectedItems.
Mais quand je l'utilise ListView1.SelectedItems, je reçois l'exception suivante:Impossible d'accéder à la collection d'éléments sélectionnés lorsque ListView est en mode virtuel?

Cannot access the selected items collection when the ListView is in virtual mode 

Comment puis-je accéder à ListView1.SelectedItems à VirtualMode.

+0

vérifier: http://stackoverflow.com/questions/444727/loop-through-all-elements-dans-une-listview-in-virtual-mode –

Répondre

-3

Je l'ai fait par le code suivant, mais il a une exception lorsque plusieurs éléments sont sélectionnés:

index était hors de portée. Doit être non négatif et inférieur à la taille de la collection. Nom du paramètre: index

List<ListViewItem> ListViewItems = new List<ListViewItem>(); 

foreach (int index in listView1.SelectedIndices) 
{ 
    ListViewItem SelectedListViewItem = listView1.Items[index]; // exception 
    ListViewItems.RemoveAt(index); 
} 
… 

void listView1_RetrieveVirtualItem(object sender, RetrieveVirtualItemEventArgs e) 
{ 
    e.Item = ListViewItems[e.ItemIndex]; 
} 

Chaque fois que vous supprimez article (s) d'une collection, toujours itérer du plus grand indice à l'indice le plus petit, comme celui-ci:

for (int index = listView1.SelectedIndices.Count - 1; i >= 0; i--) 
{ 
    … 
} 

En effet, Chaque fois que vous supprimez un élément dans une collection, l'index change si vous n'oscédez pas du plus grand au plus petit index.

2

De l'docs

En mode virtuel, la collection Items est désactivé. Tenter d'y accéder entraîne une exception InvalidOperationException. La même chose est vraie pour la collection CheckedItems et la collection SelectedItems. Si vous souhaitez récupérer les éléments sélectionnés ou sélectionnés, utilisez plutôt les collections SelectedIndices et CheckedIndices.

+2

Pourriez-vous s'il vous plaît poster un exemple de code? Merci. –

11

Il est assez vieux mais peut-être quelqu'un d'autre en bénéficiera.

utiliser simplement ListView.SelectedIndexCollection col = listView.SelectedIndices; Ensuite, vous pouvez accéder à un élément:

forearch(var item in col) 
{ 
    string txt = listView.Items[item].Text; 
} 

..mais vous ne serez pas en mesure de itérer ListView.Items en utilisant foreach parce qu'il n'y a pas iterator disponible dans ce mode. L'utilisation indexeur est tout simplement voler bien :-)

Lorsque vous essayez d'utiliser foreach vous obtenez une exception:

Lorsque le ListView est en mode virtuel, vous ne pouvez pas énumérer la collection articles ListView en utilisant un recenseur ou appelez GetEnumerator. Utilisez plutôt l'indexeur d'éléments ListView et accédez à un élément par index .

+1

juste ce que je cherchais fonctionne un régal. +1 –

+0

Ceci devrait être marqué comme la réponse acceptée – Jesse

0

Je vous stockez tous les éléments de la liste et utiliser cette liste pour donner à l'article RetrieveVirtualItem vous pouvez trouver les éléments sélectionnés comme suit

Dim lstData As List(Of ListViewItem) = New List(Of ListViewItem) 
Dim lstSelectedItems As List(Of ListViewItem) = lstData.FindAll(Function(lstItem As ListViewItem) lstItem.Selected = True) 
Me.Text = lstItems.Count.ToString()