web-dev-qa-db-fra.com

Obtenir la valeur d'un élément de zone de liste par index

Cela doit être très facile mais je suis coincé. J'ai une listBox avec X Items. Chaque élément a une description textuelle (qui apparaît dans la listBox) et sa valeur (numérique). Je veux pouvoir obtenir la propriété value d'un élément, en utilisant le numéro d'index de l'élément.

13
tzam

Ce serait

String MyStr = ListBox.items[5].ToString();
12
user3666179

Ici, je ne vois même pas une seule bonne réponse à cette question (dans la balise WinForms) et c'est étrange pour une question aussi fréquente.

Les éléments d'un contrôle ListBox peuvent être DataRowView, objets complexes, types anonymes, types primaires et autres types. La valeur sous-jacente d'un article doit être calculée sur la base de ValueMember.

Le contrôle ListBox possède un GetItemText qui vous aide à obtenir le texte de l'élément quel que soit le type d'objet que vous avez ajouté en tant qu'élément. Il a vraiment besoin d'une telle méthode GetItemValue.

Méthode d'extension GetItemValue

Nous pouvons créer GetItemValueméthode d'extension pour obtenir la valeur de l'élément qui fonctionne comme GetItemText :

using System;
using System.Windows.Forms;
using System.ComponentModel;
public static class ListControlExtensions
{
    public static object GetItemValue(this ListControl list, object item)
    {
        if (item == null)
            throw new ArgumentNullException("item");

        if (string.IsNullOrEmpty(list.ValueMember))
            return item;

        var property = TypeDescriptor.GetProperties(item)[list.ValueMember];
        if (property == null)
            throw new ArgumentException(
                string.Format("item doesn't contain '{0}' property or column.",
                list.ValueMember));
        return property.GetValue(item);
    }
}

En utilisant la méthode ci-dessus, vous n'avez pas à vous soucier des paramètres de ListBox et cela renverra Value attendu pour un élément. Cela fonctionne avec List<T>, Array, ArrayList, DataTable, Liste des types anonymes, liste des types primaires et toutes les autres listes que vous pouvez utiliser comme source de données. Voici un exemple d'utilisation:

//Gets underlying value at index 2 based on settings
this.listBox1.GetItemValue(this.listBox1.Items[2]);

Puisque nous avons créé la méthode GetItemValue comme méthode d'extension, lorsque vous souhaitez utiliser la méthode, n'oubliez pas d'inclure l'espace de noms dans lequel vous mettez la classe.

Cette méthode est également applicable sur ComboBox et CheckedListBox.

9
Reza Aghaei

Si vous travaillez sur un projet Windows Forms, vous pouvez essayer ce qui suit:

Ajoutez des éléments aux ListBox en tant qu'objets KeyValuePair:

listBox.Items.Add(new KeyValuePair(key, value);

Ensuite, vous pourrez les récupérer de la manière suivante:

KeyValuePair keyValuePair = listBox.Items[index];
var value = keyValuePair.Value;
5
Akram Shahda

J'utilise un BindingSource avec un SqlDataReader derrière lui et aucun des éléments ci-dessus ne fonctionne pour moi.

Question pour Microsoft: pourquoi cela fonctionne-t-il:

  ? lst.SelectedValue

Mais ce n'est pas le cas?

   ? lst.Items[80].Value

Je constate que je dois revenir à l'objet BindingSource, le convertir en System.Data.Common.DbDataRecord, puis faire référence à son nom de colonne:

   ? ((System.Data.Common.DbDataRecord)_bsBlocks[80])["BlockKey"]

Maintenant, c'est tout simplement ridicule.

4
Mike K

Supposons que vous souhaitiez la valeur du premier élément.

ListBox list = new ListBox();
Console.Write(list.Items[0].Value);
2
Bibhu

essayez simplement cette 'listBox' est votre liste et 'yu' est une variable à laquelle la valeur de l'index 0 sera assignée

string yu = listBox1.Items[0].ToString();
MessageBox.Show(yu);
1
Jair Martinez

Cela fonctionne pour moi:

ListBox x = new ListBox();
x.Items.Add(new ListItem("Hello", "1"));
x.Items.Add(new ListItem("Bye", "2"));

Console.Write(x.Items[0].Value);
1
DaveShaw