Autor Beitrag
Nuckey
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 78



BeitragVerfasst: Fr 20.04.12 08:12 
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 78



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 78



BeitragVerfasst: 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:
ausblenden 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.
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 78



BeitragVerfasst: 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.
ausblenden C#-Quelltext
1:
2:
3:
long p0 = GC.GetTotalMemory(true);
listbox1.Datasource = ObjectListe;
long p1 = GC.GetTotalMemory(true);

Ergebnis : p1-p0 = 2900 byte

ausblenden 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:
ausblenden 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 user profile iconTh69: Code- durch C#-Tags ersetzt