Question

Dans vb.net / winforms, comment une table de hachage peut-elle être liée à une liste déroulante ou à tout autre contrôle piloté par une source de données?

Était-ce utile?

La solution

S'agit-il de winforms, wpf ou asp.net? [mise à jour: ahh ... winforms ;-p]

winforms souhaite que les données soient IList (ou indirectement via IListSource) - je devine donc (d'après le commentaire) que vous utilisez Winforms. Aucune des collections de type dictionnaire intégrées n'implémente List<T>, mais honnêtement, cela n'a pas d'importance: si vous êtes en liaison de données, le volume est probablement assez petit, donc une liste régulière devrait suffire.

La meilleure option est quelque chose comme BindingList<T> ou T, où HashTable contient toutes les propriétés que vous souhaitez associer. Est-ce une option? Si vous êtes bloqué avec 1.1 (puisque vous mentionnez Dictionary<,> plutôt que ArrayList), utilisez <=>.

Exemple (en C #):

class MyData
{
    public int Key { get; set; }
    public string Text { get; set; }
}
[STAThread]
static void Main()
{
    var data = new List<MyData>
    {
        new MyData { Key = 1, Text = "abc"},
        new MyData { Key = 2, Text = "def"},
        new MyData { Key = 3, Text = "ghi"},
    };
    ComboBox cbo = new ComboBox
    {
            DataSource = data,
            DisplayMember = "Text",
            ValueMember = "Key"
    };
    cbo.SelectedValueChanged += delegate {
        Debug.WriteLine(cbo.SelectedValue);
    };
    Application.Run(new Form {Controls = {cbo}});
}

Autres conseils

Utilisez simplement la propriété Source de données de la liste déroulante

   DropDownList dd = new DropDownList();
   Hashtable mycountries = New Hashtable();
   mycountries.Add("N","Norway");
   mycountries.Add("S","Sweden");
   mycountries.Add("F","France");
   mycountries.Add("I","Italy");
   dd.DataSource=mycountries;
   dd.DataValueField="Key";
   dd.DataTextField="Value";
   dd.DataBind();

Exemple pour un objet donné appelé Order:

List<Order> list = new List<Order>{};

foreach (Order o in OOS.AppVars.FinalizedOrders.Values)
{
  list.Add(o);
}

this.comboBox_Orders.DataSource = list;
this.comboBox_Orders.DisplayMember = "Description";

Ce qui est bien avec cela, c'est que vous pouvez alors extraire les données de la liste en tant qu'objet d'origine (pas uniquement le champ de valeur comme dans asp.net).

Order order = (Order)this.comboBox_Orders.SelectedValue;

Utilisez .tolist. cela fonctionne également pour les types complexes retournés que vous obtenez à partir de vues / procédures stockées dans la structure d'entité

Et si vous utilisez un dictionnaire comme source de données, vous pouvez utiliser

MyDDL.Datasouce = myDict.ToList();

et il le convertira en un type de liste.

myCtrl.DataSource = myHashtable
myCtrl.DataBind()

Exemple de source de contrôle pouvant être lié:

<itemtemplate>
    <%# DataBinder.Eval(Container.DataItem, "Key", "<td>{0}</td>") %>
    <%# DataBinder.Eval(Container.DataItem, "Value", "<td>${0:f2}</td>") %>
</itemtemplate>
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top