Entwickler-Ecke
WinForms - List-Combobox ->BindingSource Sinnvoll ?
Nuckey - Fr 20.04.12 08:12
Titel: List-Combobox ->BindingSource Sinnvoll ?
in der regel (laut buch) hat man 2-3 wege daten in einer listbox zu bekommen.
1. der direkte weg per item.Add
2. direkte anbindung der liste ,per datasource
3. und über bindingsource -> listbox.datasource
bei bindingsource ,bin ich mir nicht sicher ob es in allen fällen sinn macht in bezug speichermanagment.
denn es wird von meiner ursprungs liste, in bindingsource eine weitere liste mit dehn referenzen der ursprungsliste angelegt und nach anbindung ,per datasource nochmal ,also unterm strich exestieren 3 listen mit identischen inhalt ,seh ich das richtig ?
bei der 1 und 2 variante bin ich mir nicht sicher ,aber glaube das es min. 2 listen exestieren ,die ursprung.Liste und die interne von der listbox.
wann würde bindingsource sinn machen ?
gleich eine frage hinterher ,gibt es einen generic typ von bindingsource ?
mfg nuckey
Ralf Jansen - Fr 20.04.12 10:28
| Zitat: |
| wann würde bindingsource sinn machen ? |
Meiner Meinung nach fast immer. Das Problem das neue Listen innerhalb der BindingSource erzeugt werden hast du eigentlich nur bei Datenquelle die selber keine IList sind. Ob das bei deiner Datenquelle auch passiert könntest du einfach prüfen ob an der DataSource Property die selbe Instanz hängt wie an der List Property. Wen dem so ist hast du einen simplen Wrapper um die List ohne zusätzlichen Speicheraufwand für die gewrappte Liste.
Aber mal anderes. BindingSource ist ein UI nahes Control. Wenn du dort Probleme hast und auf Speicherverbrauch genau achten musst gehe ich davon aus du kein Problem mit dem Verhalten der Controls hast sondern mit deinem UI Konzept. BindingSource soll das Binding vereinfachen was es auch definitiv tut. Und wenn man ein halbwegs vernünftiges einer Desktopanwendung angepasstes UI Konzept hat sollten die paar KB die die zusätzliche Verwaltung mit der BindingSource kosten könnte s***ß egal sein.
Nuckey - Fr 20.04.12 10:57
hio ralf ,dank dir erstmal !
als datenquellen nutze ich List<> und dictionary (testhalber)
das mit dehm vergleichen der instancen werd ich mal machen.
die sache ist die,ich habe eine liste die sich dynamisch verändert (objecte hinzufügen,löschen uzw.)
diese liste soll oder muss an meheren comboboxen/listboxen angebunden werden.
wenn in der ursprungsliste veränderungen auftreten ,solln sich die comboboxen aktualiesieren.
(methoden dazu hab ich gefunden).
daraus resultierte sich die gestellte frage.
wie schon geschrieben,werde heute mal dein vorschlag durchgehn,mal sehn was für ein resultat dabei rauskommt.
mfg nuckey
Ralf Jansen - Fr 20.04.12 11:40
| Zitat: |
die sache ist die,ich habe eine liste die sich dynamisch verändert (objecte hinzufügen,löschen uzw.)
diese liste soll oder muss an meheren comboboxen/listboxen angebunden werden. |
In dem Fall wirst du dir ohne BindingSource einen Wolf programmieren. Wenn du es doch versuchst wirst du vermutlich letztlich dabei landen eine BindingSource nach zu programmieren ;)
Nuckey - Fr 20.04.12 11:58
habe dein rat befolg und die instancen verglichen.
ergebniss von bindingsource war das die instance der urliste übernommen wird,sprich manipulationen direkt bindingsource,wirken sich direkt auf die urliste aus:
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| Bindingsource bs = new Bindingsource(); List<string> liste = new List<string>(); //zu testzwecke bs.Datasource = liste;
bool b0 = bs.List.Equals(liste) -> true
ebenso
List<string> test = bs.List as List<string>;
bool l2 = test.Equals(liste); ergab true
bs.List.RemoveAt(0) ,ergab das auch in der urlist das erste element gelöscht wurde |
das raus resultierend kann ich für mich sagen das die bs.List = Liste ist.
anders verhält es sich mit der daten anbindung an einer combo-listbox.
hier wird eine flache kopie der liste/bindingsource gemacht.
Quelltext
1: 2:
| CurrencyManager cum = (CurrencyManager)listBox1.BindingContext[bs]; bool b1 = cum.List.Equals(bs.List); ergab false |
also exestieren mindensten zwei listen ,einmal Bindingsource/Liste und Combo-listbox
gut damit ist erstmal das thema bindingsource durch ;)
aber die frage nach dehm sinn (speziell für meine zwecke bleiben offen)
da wenn ich egal bindingsource oder Liste immer eine "kopie" in der combo-listbox angeleget wird.
sinn würde es wahrscheinlich wenn es um datasets geht,machen (aba da schweigt mein buch).
und dank dir nochmal ralf für dehn tip
mfg nuckey
Nuckey - Sa 21.04.12 09:07
habe heute mal dehn speicherverbrauch geprüft:
hier ist die direkt zuweisung zur combo-listbox geringer als zu bindingsource
beispiel:aktuell halte ich 83 objecte in einer gen.-liste.
C#-Quelltext
1: 2: 3:
| long p0 = GC.GetTotalMemory(true); listbox1.Datasource = ObjectListe; long p1 = GC.GetTotalMemory(true); |
Ergebnis : p1-p0 = 2900 byte
C#-Quelltext
1: 2: 3: 4: 5: 6:
| BindingSource bs = new BindingSource(); . . long p0 = GC.GetTotalMemory(true); bs.Datasource = ObjectListe; long p1 = GC.GetTotalMemory(true); |
Ergebnis : 9024 byte
gesamtergebniss:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7:
| BindingSource bs = new BindingSource(); . . long p0 = GC.GetTotalMemory(true); bs.Datasource = ObjectListe; listbox1.Datasource = bs; long p1 = GC.GetTotalMemory(true); |
Ergebniss: gesamt 11467 byte
also dürfte unterm strich die direkte anbindung speicherschonender sein als über bindingsource,was eher soweit ich gelesen habe in bereich ado.net und datasets sinnvoller wäre.
mfg nuckey
Moderiert von
Th69: Code- durch C#-Tags ersetzt
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!