2009-05-19 5 views
2

J'essaie d'afficher des paires clé/valeur d'un dictionnaire à un ListBox.Comment afficher un dictionnaire dans un ListBox

Key Value 
A 10 
B 20 
C 30 

Je veux les afficher dans une zone de liste au format suivant

A(10) 
B(20) 
C(30) 

En utilisant le code suivant, je suis en mesure de relier Listbox.Datasource au dictionnaire.

myListBox.DataSource = new BindingSource(myDictionary, null); 

Son être affiché comme

[A, 10] 
[B, 20] 
[C, 30] 

Je ne peux pas comprendre comment le formater afin qu'il soit affiché dans la façon dont je veux.

Toute aide sera appréciée.

Merci Ashish

+0

Vous voudrez peut-être ajouter une balise à cette question en indiquant la langue tu utilises En outre, vous pouvez sélectionner le code et appuyez sur ctrl-k pour le formater. Bienvenue sur Stackoverflow. – Stephan202

Répondre

6

Utilisez le événement Format sur la liste:

KeyValuePair<string, int> item = (KeyValuePair<string, int>)e.ListItem; 
e.Value = string.Format("{0}({1})", item.Key, item.Value); 
+0

Merci! Cela a fonctionné magnifiquement! – Ashish

0

Vous pouvez itérer sur l'objet dictionnaire et construire l'élément listbox que vous allez.

foreach (KeyValuePair<string, int> kvp in myDictionary) 
    { 
     lbx.Items.Add(String.Format("{0}({1})", kvp.Key, kvp.Value.ToString())); 
    } 
+0

Mais alors, vous devrez analyser les valeurs de chaîne pour récupérer la clé ou la valeur séparément ailleurs. En outre, vous perdriez la liaison de données. – CoderDennis

5

Pour flexiblitity approprié à long terme, je voudrais essayer et utiliser un objet typé, alors vous pouvez faire ce que vous aimez plus tard, déclencher des événements, modifier les valeurs, pas d'utiliser des clés uniques, obtenir un objet réel de listbox plutôt que de simplement une chaîne formatée

public partial class tester : Form 
{ 
    public tester() 
    { 
     InitializeComponent(); 
     List<MyObject> myObjects = new List<MyObject>(); 
     MyObject testObject = new MyObject("A", "10"); 
     myObjects.Add(testObject); 
     BindingSource bindingSource = new BindingSource(myObjects,null); 
     listBox1.DisplayMember = "DisplayValue"; 
     listBox1.DataSource = bindingSource; 
    } 
} 

public class MyObject 
{ 
    private string _key; 
    private string _value; 

    public MyObject(string value, string key) 
    { 
     _value = value; 
     _key = key; 
    } 

    public string Key 
    { 
     get { return _key; } 
    } 

    public string Value 
    { 
     get { return _value; } 
    } 

    public string DisplayValue 
    { 
     get { return string.Format("{0} ({1})", _key, _value); } 
    } 
} 
+0

Oui, c'est une solution beaucoup mieux tout autour et devrait avoir été marquée comme la réponse IMO. – Andy

0

en fait, si vous souhaitez personnaliser zone de liste en dérivent et passer outre

protected override OnDrawItem

La réponse 1 obtiendra ce que vous avez indiqué dans la question, mais si vous voulez refléter des changements dans les objets, il serait préférable que vous écriviez la routine de dessin pour qu'elle reflète automatiquement.

ou vous pouvez changer le texte de l'article qui ferait également l'affaire.

Ne pas oublier d'appeler BeginUpdate() et EndUpdate()

+0

Pas besoin de dériver une listbox personnalisée. Il suffit de gérer l'événement DrawItem. – CoderDennis

Questions connexes