Comment une table de hachage peut-elle être liée à une liste déroulante?
-
08-07-2019 - |
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?
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>