2016-05-20 4 views
0

Aujourd'hui, j'ai un problème étrange avec la liaison d'une source de données à un dictionnaire avec une auto-propriété.Liaison d'un dictionnaire <int, auto-propriété> comme source de données à une zone de liste déroulante

  • IDE: Visual Studio 2015
  • Langue: C#
  • Utilisation: Application Windows Forms

J'ai créé un dictionnaire avec une propriété automatique en tant que valeur:

Dictionnaire:

/// <summary> 
/// Class that cotains names of various DMS items of the currently selected batch. 
/// </summary> 
internal class DMSItemDictionary : Dictionary<int, DMSItemName> 
{ 
    /// <summary> 
    /// Adds a DMS item to the dictionary. 
    /// </summary> 
    /// <param name="ItemKey">Key of the DMS item.</param> 
    /// <param name="ItemID">ID of the DMS item.</param> 
    /// <param name="ItemName">Name of the DMS item.</param> 
    internal void Add(int ItemKey, int ItemID, string ItemName) 
    { 
     DMSItemName DMSItem = new DMSItemName(); // Creates a new DMS item auto property. 
     DMSItem.ID = ItemID; // Sets the item ID. 
     DMSItem.Name = ItemName; // Sets the item name. 
     this.Add(ItemKey, DMSItem); // Adds the DMS item to the dictionary. 
    } 
} 

Automobile:

/// <summary> 
/// Auto property that's used for DMS item names. 
/// </summary> 
internal class DMSItemName 
{ 
    /// <summary> 
    /// The ID of the DMS item. 
    /// </summary> 
    public int ID { get; set; } 

    /// <summary> 
    /// The name of the DMS item. 
    /// </summary> 
    public string Name { get; set; } 
} 

J'utilise le dictionnaire interger dans le que posibility pour trier les éléments dans l'ordre que je les reçois d'une autre assemblée.

Voici un exemple de comment remplir le dictionnaire avec des entrées.

Exemple insert d'entrée:

Dictionaries.DMSItemDictionary DMSIndexComboBoxData = new Dictionaries.DMSItemDictionary(); 
for (int IndexCount = 0; IndexCount < DMSIndizes.Count; IndexCount++) 
{ 
    int IndexID = DMSIndizes[IndexCount].ID; 
    string IndexName = DMSIndizes[IndexCount].Name; 
    DMSIndexComboBoxData.Add(IndexCount, IndexID, IndexName); 
} 

Et voici un exemple que je lie le dictionnaire.

Exemple de données bind:

BindingSource DataSource = new BindingSource(DMSIndexComboBoxData, null); 
DataGridViewComboBoxCell comboBoxIndizes = new DataGridViewComboBoxCell(); 
comboBoxIndizes.DisplayMember = "Value.Name"; 
comboBoxIndizes.ValueMember = "Value.ID"; 
comboBoxIndizes.DataSource = DataSource; 

Mon problème est que seule la première entrée du dictionnaire est affichée dans la zone de liste déroulante. Sauf que tout fonctionne bien (le champ correct est utilisé comme membre d'affichage et le champ correct est utilisé comme membre de valeur.)

De plus, si je parcours le dictionnaire avec une foreach et une console, toutes les entrées sont renvoyées correctement.

Quelqu'un peut-il trouver une raison pour laquelle j'ai ce problème?

Un grand merci à l'avance, Florian 'kami' Zedler

post-scriptum Désolé pour mon mauvais anglais, si vous avez des questions, j'essaie d'expliquer encore plus loin.

Des explications complémentaires: Le dictionnaire se populatet par une fonction d'un autre ensemble dans un ordre précis. Quelques Exemple de données:

  • ItemID: 10203, ItemName: test1234
  • ItemID: 0815, ItemName: Test
  • ItemID: 1, ItemName: Test1
  • ItemID: 99999, ItemName: azerty

Mon client souhaite que cette commande soit annulée.(Dernière entrée en premier, mais pas ordonnée par ID) C'est la raison pour laquelle j'ai cette configuration dictionnaire/autoporperty, ici je peux simplement changer l'ordre de la clé.

+1

Je suis un peu confus pourquoi cela fonctionnerait pour le premier article. Boucler dans un dictionnaire vous donne 'KeyValuePair's, avec les propriétés' Key' et 'Value'. Donc, dans mon livre, vous devez spécifier "Value.Name" comme membre d'affichage et "Value.ID" comme membre de valeur. – Domysee

+0

Désolé, vous avez raison. J'ai oublié de changer cela dans le code d'exemple. Mais alors seulement le premier élément est montré dans la zone de liste déroulante ... – kami

+0

Et beforce vous demandez: "new BindingSource (DMSDropDownItems," Value ")" a le même résultat, une seule entrée est affichée dans la liste déroulante :( – kami

Répondre

1

Si vous voulez juste inverser la commande, pourquoi ne pas utiliser la méthode Reverse de Array? Exemple de code:

DMSItemName[] DMSIndizes = new DMSItemName[4]; 

//Sample data 
DMSIndizes[0] = new DMSItemName(); 
DMSIndizes[0].ID = 10203; 
DMSIndizes[0].Name = "Test1234"; 
DMSIndizes[1] = new DMSItemName(); 
DMSIndizes[1].ID = 0815; 
DMSIndizes[1].Name = "Test"; 
DMSIndizes[2] = new DMSItemName(); 
DMSIndizes[2].ID = 1; 
DMSIndizes[2].Name = "Test1"; 
DMSIndizes[3] = new DMSItemName(); 
DMSIndizes[3].ID = 99999; 
DMSIndizes[3].Name = "qwerty"; 

var reversed = DMSIndizes.Reverse(); 
BindingSource DataSource = new BindingSource(reversed, null); 
comboBox1.DisplayMember = "Name"; 
comboBox1.ValueMember = "Id"; 
comboBox1.DataSource = DataSource;