2016-05-20 6 views
0

Heute habe ich ein seltsames Problem beim Binden einer Datenquelle an ein Diktat mit einer autoproperty.Binden eines Wörterbuchs <int, auto-property> als Datenquelle an eine Combobox

  • IDE: Visual Studio 2015
  • Sprache: C#
  • Verbrauch: Windows Forms-Anwendung

Ich habe ein Wörterbuch mit einem Auto Eigenschaft als Wert erstellt:

Wörterbuch:

/// <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. 
    } 
} 

Auto Eigenschaft:

/// <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; } 
} 

ich das interger im Wörterbuch als posibility unter Verwendung der Elemente in der Reihenfolge ich sie von einer anderen Baugruppe erhalten zu sortieren.

Hier ist ein Beispiel, wie ich das Wörterbuch mit Einträgen füllen.

Beispieleintrag einfügen:

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

Und hier ist ein Beispiel, wie ich das Wörterbuch binden.

Beispieldaten binden:

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

Mein Problem ist, dass nur der erste Eintrag aus dem Wörterbuch in der Combobox angezeigt wird. Außer dass alles gut funktioniert (Das korrekte Feld wird als Anzeigeelement verwendet und das korrekte Feld wird als Wertelement verwendet.)

Zusätzlich, wenn ich das Wörterbuch mit einer foreach und einer Konsole durchschreibe, werden alle Einträge korrekt zurückgegeben.

Kann jemand einen Grund finden, warum ich dieses Problem habe?

Vielen Dank im Voraus, Florian 'Kami' Zedler

P. S. Sorry für mein schlechtes Englisch, wenn du irgendwelche Fragen hast, versuche ich es noch einmal zu erklären.

Eine weitere Erklärung: Das Wörterbuch durch eine Funktion von einer anderen Baugruppe in einer bestimmten Reihenfolge populatet wird. Einige Beispieldaten:

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

Mein Kunde möchte, dass dieser Auftrag storniert wird.(Letzter Eintrag zuerst, aber nicht nach ID sortiert) Das ist der Grund, warum ich dieses Wörterbuch/Autoportery-Setup habe, hier kann ich einfach die Reihenfolge des Schlüssels ändern.

+1

Ich bin ein wenig verwirrt, warum dies für den ersten Artikel funktionieren würde. Beim Durchlaufen eines Wörterbuchs erhalten Sie 'KeyValuePair' mit den Eigenschaften' Key' und 'Value'. In meinem Buch müssten Sie "Value.Name" als Anzeigeelement und "Value.ID" als Wertelement angeben. – Domysee

+0

Entschuldigung, Sie haben Recht. Ich habe vergessen, das im Beispielcode zu ändern. Aber dann wird nur das erste Element in der Combobox angezeigt ... – kami

+0

Und Beforce Sie fragen: "neue BindingSource (DMSDropDownItems," Value ")" hat das gleiche Ergebnis, nur ein Eintrag wird in der Combobox angezeigt :( – kami

Antwort

1

Wenn Sie nur die Reihenfolge umkehren möchten, warum nicht Reverse Methode von Array verwenden? Beispielcode:

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; 
Verwandte Themen