2010-10-06 7 views
3

Je suis d'ajouter des éléments à une zone de liste déroulante comme indiqué ci-dessous:Liaison de données sur la zone de liste déroulante

readonly Dictionary<string, string> _persons = new Dictionary<string, string>(); 
    .... 
    //<no123, Adam>, <no234, Jason> etc.. 
    foreach (string key in _persons.Keys) 
    { 
     //Adding person code 
     cmbPaidBy.Items.Add(key);     
    } 

Je veux faire de la zone de liste déroulante plus lisible en affichant les valeurs du dictionnaire (c.-à-noms). Mais j'ai besoin des codes personnels (no123 etc) pour aller chercher dans la base de données en fonction de l'entrée de l'utilisateur.

Quelle est la bonne façon de procéder? Comment puis-je lier à la fois la valeur et la clé d'un élément de zone de liste déroulante?

+1

Est-ce un combobox WinForms ou WPF? –

Répondre

5

Le DisplayMember et les propriétés ValueMember sont là pour vous:

cmbPaidBy.DataSource = new BindingSource(_persons, null); 
cmbPaidBy.DisplayMember = "Value"; 
cmbPaidBy.ValueMember = "Key"; 

plus en profondeur information here, et ici sur le BindingSource Class

Le composant BindingSource t sert à plusieurs fins. Tout d'abord, il simplifie les contrôles de liaison sur une forme de données en fournissant la gestion des devises, la notification de changement, et d'autres services entre les contrôles Windows Forms et source de données

+0

Wow! Merci! Avec cela, j'ai utilisé SelectedValue pour obtenir le membre de valeur. – devnull

1

Étant donné que Dictionary<TKey, TValue> n'implémente pas IList (ou l'une des autres interfaces de source de données), il ne peut pas être utilisé comme source de données pour la liaison. Vous pouvez utiliser une autre représentation, par exemple DataTable ou List<KeyValuePair<TKey, TValue>>.

Dans ce dernier cas, vous pouvez lier facilement en utilisant le code suivant:

cmbPaidBy.ValueMember = "Key"; 
cmbPaidBy.DisplayMember = "Value"; 
cmbPaidBy.DataSource = _persons; // where persons is List<KeyValuePair<string,string>> 
0

Vous pouvez le faire en XAML, comme suit:

<ComboBox ItemsSource="{Binding Persons}" DisplayMemberPath="Key" ValueMemberPath="Value" /> 

Assurez-vous que vous pouvez lier à votre collection (simple dictionnaire ne le fera pas, ce n'est pas une collection observable) - l'exemple here utilise des tables de données ...

0

Binding un dictionnaire simple (paire de valeurs clé) zone de liste déroulante en tant que membre d'affichage et membre de valeur dans XAML

<ComboBox Height="23" HorizontalAlignment="Left" SelectedItem="{Binding SelectedKeyValue}" SelectedValuePath="Value" DisplayMemberPath="Key" Width="120"  x:Name="comboBox1" /> 

    <TextBox Height="23" HorizontalAlignment="Left" Name="textBox1" Width="120" Text="{Binding Path=SelectedValue, ElementName=comboBox1, Mode=TwoWay}"/> 
Questions connexes