web-dev-qa-db-fra.com

Obtenir une liste uniqueAfficher un élément sélectionné

J'ai la propriété MultiSelect de listView définie sur false et j'essaie d'obtenir un seul listViewItem. Mais la propriété disponible est SelectedItems. J'ai utilisé le code suivant ...

foreach (ListViewItem item in listView1.SelectedItems)
{
    //do something with item.text or whatever
}

Parce que je sais qu’un seul élément sera sélectionné. Quelle est la bonne façon de faire cela?

10
topofsteel

SelectedItems renvoie généralement une collection, un tableau ou une IQueryable.

De toute façon, vous pouvez accéder aux éléments via Index comme avec un tableau:

String text = listView1.SelectedItems[0].Text; 
//do something

En passant, vous pouvez toujours sauvegarder un élément que vous voulez regarder dans un var lookat = whatever you want et vérifier sa structure dans Locals après avoir défini un point d'arrêt.

20
Vogel612

Je fais ça comme ça:

if (listView1.SelectedItems.Count > 0)
{
     var item = listView1.SelectedItems[0];
     //rest of your logic
}
9
gzaxx

Parfois, utiliser uniquement la ligne ci-dessous me lance une exception,

String text = listView1.SelectedItems[0].Text; 

donc j'utilise ce code ci-dessous:

private void listView1_SelectedIndexChanged(object sender, EventArgs e) 
{ 
    if (listView1.SelectedIndices.Count <= 0) 
    { 
        return; 
    } 
    int intselectedindex = listView1.SelectedIndices[0]; 
    if (intselectedindex >= 0) 
    {
        String text = listView1.Items[intselectedindex].Text;

        //do something
        //MessageBox.Show(listView1.Items[intselectedindex].Text); 
    } 
}
4
Pedro Loureiro

Si c'est juste une petite application avec un ou deux listviews, je crée normalement une petite propriété d'aide:

private ListViewItem SelectedItem { get { return (listView1.SelectedItems.Count > 0 ? listView1.SelectedItems[0] : null); } }

Si j'ai des charges, déplacez-le vers une petite classe d'aide:

internal static class ListViewEx
{
    internal static ListViewItem GetSelectedItem(this ListView listView1)
    {
        return (listView1.SelectedItems.Count > 0 ? listView1.SelectedItems[0] : null);
    }
}

alors:

ListViewItem item = lstFixtures.GetSelectedItem();

L’interface ListView est un peu nul, donc je trouve normalement que la classe d’aide grandit assez rapidement

1
Vman

Aucune des réponses ci-dessus, du moins pour moi, ne montre comment déterminer si vous avez un ou plusieurs éléments, et comment extraire les valeurs de vos éléments de manière générique, sans que cela ne dépende en réalité un élément ou plusieurs, alors je lance mon chapeau dans le ring.

Ceci est assez facilement et génériquement fait en vérifiant votre nombre pour voir que vous avez au moins un élément, puis en effectuant une boucle foreach sur le .SelectedItems, en convertissant chaque élément en tant que DataRowView:

if (listView1.SelectedItems.Count > 0)
{
     foreach (DataRowView drv in listView1.SelectedItems)
     {
         string firstColumn = drv.Row[0] != null ? drv.Row[0].ToString() : String.Empty;
         string secondColumn = drv.Row[1] != null ? drv.Row[1].ToString() : String.Empty;
         // ... do something with these values before they are replaced
         // by the next run of the loop that will get the next row
     }
}

Cela fonctionnera, que vous ayez 1 élément ou plus. C'est drôle que MSDN dit d'utiliser ListView.SelectedListViewItemCollection pour capturer listView1.SelectedItems et le parcourir, mais j'ai trouvé que cela donnait une erreur dans mon application WPF: The type name 'SelectedListViewItemCollection' does not exist in type 'ListView'.

0
vapcguy

Voici ce que je recommande pour un panier d'achat. Je vais le décomposer en sa forme la plus simple.

En supposant que nous commençons par ceci (une liste avec 2 colonnes, 2 boutons et une étiquette): starting

Commençons par supprimer les éléments. Pour ce faire, nous allons saisir notre bouton Supprimer:

private void button2_Click(object sender, EventArgs e)
{
    listView1.Items.Remove(listView1.SelectedItems[0]);
    label1.Text = updateCartTotal().ToString();
}

Maintenant, la deuxième ligne met à jour le total de nos étiquettes en utilisant la fonction suivante que je posterai pour additionner tout le total de la colonne 2 dans la vue liste:

private decimal updateCartTotal()
{
    decimal runningTotal = 0;
    foreach(ListViewItem l in listView1.Items)
    {
        runningTotal += Convert.ToDecimal(l.SubItems[1].Text);
    }
    return runningTotal;
}

Vous n'êtes pas obligé d'utiliser la décimale comme je l'ai fait, vous pouvez utiliser float ou int si vous n'avez pas de décimales. Alors décomposons-le. Nous utilisons une boucle for pour totaliser tous les éléments de la colonne 2 (SubItems [1] .Text). Ajoutez cela à une décimale que nous avons déclarée avant la boucle foreach pour conserver un total. Si vous voulez faire de l'impôt, vous pouvez faire quelque chose comme:

return runningTotal * 1.15;

ou quel que soit votre taux d'imposition.

En résumé, en utilisant cette fonction, vous pouvez retoter votre liste en appelant simplement la fonction. Vous pouvez modifier le texte des étiquettes comme je l'ai déjà fait si c'est ce que vous voulez.

0
Tim Hinz

Cela fonctionne pour les listes à sélection unique ou multiple:

foreach (ListViewItem item in listView1.SelectedItems)
{
    int index = ListViewItem.Index;
    //index is now zero based index of selected item
}
0
Nikola