windows - .NET Dictionary Keys som ListBox DataSource

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg har en ListBox i min winforms app. Jeg vil have, at det som DataSource har nøglerne til en ordbog, så jeg gør som følger:


IDictionary<Entity1, Entity2> myEntities = new Dictionary<Entity1, Entity2>();
myListBox.DataSource = myEntities.Keys;


Så jeg får på den anden linje følgende fejl:



  Kompleks databinding accepterer som datakilde enten i Ilist eller IListSource




  • Jeg har prøvet to ting, som ikke plejer at gøre:


    myListBox.DataSource=(IList < Entity1>) myEntities.Keys;



kaster InvalidCastException-undtagelse:



  Kan ikke konvertere et objekt af typen 'KeyCollection [[Entity1, Entity2]]' for at skrive 'System.Collections.Generic.IList`1 [[Entity1]]'.




  • Og jeg har også prøvet:


    myListBox.DataSource=myEntities.Keys.ToList < Entity1> ();



men på den måde mister jeg bindingen, når jeg ændrer myEntities, ændres myListBox.DataSource ikke.


Bemærk: De undtagne meddelelser oversættes af mig, så de kan ikke være præcis som jeg skrev.


Enhver måde at gøre gør dette?


Tak!

Bedste reference


  myListBox.DataSource = (from keys in myEntities.Keys
                         select keys)
                         .ToList();


Tredje gang en charme ...


Okay,


Jeg tror, ​​at du bliver nødt til at arve ordbogen og tilsidesætte .Add-metoden til at udløse en begivenhed. På begivenheden bliver du nødt til at genforske ordbogstasterne. I henhold til de ressourcer, jeg har fundet (herunder: Hvordan binder ...), smider ordbogen ikke begivenheder, når indholdet ændres.

Andre referencer 1


Det største problem er, at du i sidste ende kan bruge ordbøgerne Keys som en DataSource, men du har ikke mulighed for at underrette DataSource, som du har tilføjet eller fjernet elementer fra ordbogen.


Dette skyldes, at ordbogen ikke har nogen underretningshændelse til det, derfor kender DataSource ikke, hvordan og hvornår din ordbog er ændret. De elementer, der allerede er til stede på din liste, fik deres ændringer afspejlet, simpelthen fordi DataSource har en reference til dem, og så når de ændrer ændringerne, er synlige, hvor der er en reference.


For at udløse en ændring i din ordbog, så vidt jeg ved, har du ikke mange valgmuligheder:



  • Skriv en kode for at geninstallere listen til din datasource hver gang du tilføjer eller fjerner noget fra ordbogen (med alle problemer med at holde de markerede elementer osv.)

  • Opret din egen datastruktur enten ved at implementere IBindingList eller ved at hente direkte fra BindingList. [7]



begge er ikke nemme løsninger, så hvis dine enheder er relativt enkle, kan du overveje nogle alternativer som DataTables, som kunne indeholde en kompleks nøgle og andre strukturerede data. [8]

Andre referencer 2


Prøv at bruge


myListBox.DataSource = myEntities