2008-11-18 5 views

Répondre

2

Est-ce WinForms, WPF ou asp.net? [Mise à jour: ahh ... ;-P WinForms]

WinForms veut être données IList (ou, indirectement, par l'intermédiaire IListSource) - donc je devine (le commentaire) que vous utilisez WinForms. Aucune des collections de type dictionnaire incorporées n'implémente IList, mais pour être honnête, cela n'a pas d'importance: si vous avez une 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 List<T> ou BindingList<T>, où T a toutes les propriétés que vous voulez lier. Est-ce une option? Si vous êtes bloqué avec 1.1 (puisque vous mentionnez HashTable au lieu de Dictionary<,>), utilisez ArrayList.

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}}); 
} 
+0

Vous avez absolument raison - c'est un projet winforms. Je n'avais pas réalisé qu'il y aurait une telle différence. Merci beaucoup. – Jeffrey

4

Il suffit d'utiliser la propriété des listes déroulantes Datasource

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(); 
+0

Cela pour une raison quelconque me donne cette erreur: "DataBinding complexe accepte comme une source de données soit un IList ou un IListSource." – Jeffrey

+0

Je ne sais pas pourquoi cela se produirait .. est l'exception étant levée par la ligne DataBind()? –

0
myCtrl.DataSource = myHashtable 
myCtrl.DataBind() 

source Exemple de contrôle bindable:

<itemtemplate> 
    <%# DataBinder.Eval(Container.DataItem, "Key", "<td>{0}</td>") %> 
    <%# DataBinder.Eval(Container.DataItem, "Value", "<td>${0:f2}</td>") %> 
</itemtemplate> 
1

Exemple pour un objet donné appelé Ordre:

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 cool à ce sujet est que vous pouvez alors récupérer les données de la liste comme l'objet original (pas seulement le champ de valeur comme dans asp.net).

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

Et, si vous arrive d'utiliser le dictionnaire comme source de données, vous pouvez utiliser

MyDDL.Datasouce = myDict.ToList(); 

et il le convertir en un type de liste.

0

Utilisez .tolist. Cela fonctionne également pour les types complexes retournés que vous obtenez des vues/procédures stockées dans le framework d'entité

+0

Est-ce quelque chose de nouveau dans les versions ultérieures de .net? – Jeffrey

+0

il a été introduit dans le cadre 3.5 pour autant que je sache – Coder22

Questions connexes