Entwickler-Ecke
WinForms - List Box - einzelnen "Einträgen" Werte zuweisen
Murphy9904 - Mi 08.09.10 09:47
Titel: List Box - einzelnen "Einträgen" Werte zuweisen
Hi,
ich möchte wie die Überschrift schon sagt den Einträgen aus einer "List Box" einzelne Werte Zuweisen
Das stelle ich mir nicht ganz leicht vor weil die Einträge die Reihenvolge ändern können
Hab hier ein Bild:
Ich möchte dass ich Pro Eintrag einen eigenen "Alias" Vergeben kann und das am Ende Speichern
(ich könnte ja auch Pro Eintrag eine eigene Variable erstellen aber wenn das mehr werden macht das kein sinn)
Danke schonmal
Murphy
danielf - Mi 08.09.10 10:59
Hallo,
du kannst dem ListBoxItem im Tag Objekt ein beliebiges Objekt hinzufügen.
Das Objekt kannst du dann mit entsprechenden Properties versehen. Beim Auswählen eines Item übergibst du dann dieses Tag (cast wird benötigt). Die Properties kannst du dann beliebig zuweisen.
Gruß
Necaremus - Mi 08.09.10 11:05
alternativ, solltest du mehr als nur 1 wert benötigen, kannst du dir eine eigene klasse bauen, die dann vom ListBoxItem erbt :)
Murphy9904 - Mi 08.09.10 11:10
hi
Danke für die schnellen Antworten,
Ich bin ja noch recht neu in C# und das ging mir grad bissel zu schnell
ListBoxItem im Tag Objekt <-- wo ist das?
Und Klasse bauen wäre warscheinlich angebracht --> hab ich aber auch noch nie gemacht.. (aber das schaff ich schon)
Danke, ich hoffe ich bekomme das hin
LG
Murphy
danielf - Mi 08.09.10 11:18
Deiner ListBox fügst du Objekte hinzu. Angezeigt wird dann die String-Repräsentation davon. Ich gehe davon aus, dass du strings hinzufügst. Mit dem Objekt folgt das analog, nur das du eben die Instanz der erstellten Klasse verwendest.
C#-Quelltext
1: 2: 3: 4: 5:
| ListBox lb = new ListBox();
MyClass item1 = new MyClass("Eintrag1", "alias");
lb.Items.Add(item1); |
Und schon "verbirgt" sich hinter dem ListBoxItem ein Objekt vom Typ MyClass mit den beliebigen Informationen.
Necaremus - Mi 08.09.10 11:20
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17:
| public class MyListBoxItem : ListBoxItem { public string Alias { get; set; }+ public Types Type { get; set; } public enum Types { Project, ProjectGroup }
public MyListViewItem(string name, string alias, Types type) { this.Name = name; this.Text = name; this.Alias = alias; this.Type = type; } } |
... da war wer anders schneller^^
das hier wäre halt die "MyClass".
danielf - Mi 08.09.10 11:23
Eine ListBox nimmt beliebige Objekte auf, dementsprechend muss man nicht von ListBoxItem ableiten.
Was in der Liste angezeigt wird bestimmst du indem du die ToString-Methode überschreibst.
Murphy9904 - Mi 08.09.10 11:59
Wow danke für die ganzen Antworten..
aber ich blicke durch eure Codes noch nicht ganz durch
was genau soll das ListBoxItem Darstellen?
Quelltext
1:
| public class MyListBoxItem : ListBoxItem //<-- das hier |
und was der cunstructor anstellt hab ich auch nicht raus - sollte man das nicht als "void" schreiben? oder muss die dann auch einfach nur MyListBoxItem heissen?
was verbirgt sich denn hinter dem Types?
LG Murphy
bei mir schaut das jetz so aus:
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19:
| public class MyListBoxItem : MyListBoxItem { public string Alias { get; set; } public string Name { get; set; } public string Text { get; set; }
public Types Type { get; set; } public enum Types { Project, ProjectGroup }
//cunstructor public MyListBoxItem(string name, string alias, Types type) { this.Name = name; this.Text = name; this.Alias = alias; this.Type = type; } } |
Ralf Jansen - Mi 08.09.10 12:26
Zitat: |
Was in der Liste angezeigt wird bestimmst du indem du die ToString-Methode überschreibst. |
Möglich, ich finde ToString für Anzeigezwecke zu überschreiben aber als Unart. ToString sollte (in komplexen Klassen) eher eine Zusammenfassung fürs Debuggingzwecke liefern wenn man es denn überschreibt. Insbesondere weil man ToString nur 1mal überschreiben kann. Also lieber den DisplayMember an der Listbox(oder auch an anderen Controls) setzen.
C#-Quelltext
1:
| public class MyListBoxItem : MyListBoxItem |
Von sich selbst ableiten wird nicht funktionieren lass den Doppelpunkt und denn Teil dahinter einfach weg. Dann sollte deine Klasse eigentlich schon funktionieren.
C#-Quelltext
1: 2: 3: 4:
| listbox.DisplayMember = "Alias"; MyListBoxItem item = new MyListBoxItem("mein Name", "mein Alias", MyListBoxItem.Types.Project); listbox.Items.Add(item); |
Necaremus - Mi 08.09.10 13:02
blubb, den rest hinterm alias hatte ich aus meinem snippet(code beispiel) dran hängen lassen, damit du sehen kannst, wie man soetwas eventuell erweitern könnte...
benötigen tust du das aufjedenfall nicht x_X
des weiteren hatte ich das control grad mit listview verwechselt... daher die ableitung :/
der cunstructor wird aufgerufen wenn du zb.
MyClass myClass1 = new MyClass() aufrufst.
prinzipiell würde dir aber ja schon ne klasse mit 2 strings reichen... also
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| public class MyClass { public string Name { get; set; } public string Alias { get; set; } public MyClass(string name, string alias) { this.Name = name; this.Alias = alias; } } |
Murphy9904 - Mi 08.09.10 13:12
Ok cool, ja habe es jetzt für meine Zwecke angepasst.
jetzt nurnoch ein Problem.. ich hatte davor mit "ListBoxRight.SelectedItem" das selectierte Objekt aufindig gemacht. jetzt funktioniert das aber nicht mehr
ListBoxRight.SelectedItem.ToString() sagt mir dann nur: "WindowsFormsApplication1.MyListBoxItem"
Ralf Jansen - Mi 08.09.10 13:15
SelectedItem ist jetzt eine Instanz von deinem Klassentyp MyListBoxItem.
Dort wo du mit SelectedItem arbeiten willst musst du also auf MyListBoxItem casten.
C#-Quelltext
1: 2: 3: 4: 5:
| MyListBoxItem item = ListBoxRight.SelectedItem as MyListBoxItem; if(item != null) { } |
Murphy9904 - Mi 08.09.10 13:29
Geil,
klappt jetzt fast alles so wie ich es brauche :dance2:
jetzt geht aber eines nicht..
ich hab so paar Buttons gemacht um die Einträge von der einen Seite auf die Andre zu schieben.. das hatte ich mit ListBoxLeft.Items.Add() & ListBoxRight.Items.Remove() gemacht.
das klappt aber nichmehr :(
was kann ich da machen?
Ralf Jansen - Mi 08.09.10 13:44
Zeig mal deinen Code und sag deutlicher was nicht geht.
Ein Code zum verschieben z.B. so
C#-Quelltext
1: 2: 3: 4: 5: 6:
| MyListBoxItem item = ListBoxLeft.SelectedItem as MyListBoxItem; if(item != null) { ListBoxLeft.Items.Remove(item); ListBoxRight.Items.Add(item); } |
geht nicht?
Murphy9904 - Mi 08.09.10 13:50
Sorry mit If hatte ichs nich getestet.. so gehts..
aber da geht es dann nicht wenn man mehrere gleichzeitig verschieben will
(ich habs mir while gemacht damit es auch mit mehreren geht)
Zur not muss ich dann halt paar mal Klicken.. das is jetzt nur ein kleiner "Schönheitsfehler"
Ralf Jansen - Mi 08.09.10 14:18
Zitat: |
aber da geht es dann nicht wenn man mehrere gleichzeitig verschieben will |
Dann halt
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| if (ListBoxLeft.SelectedItems.Count > 0) { MyListBoxItem[] items = new MyListBoxItem[ListBoxLeft.SelectedItems.Count]; ListBoxLeft.SelectedItems.CopyTo(items, 0); foreach (var item in items) { ListBoxLeft.Items.Remove(item); ListBoxRight.Items.Add(item); } } |
Murphy9904 - Mi 08.09.10 14:34
Cool is ja Hammer wie einem hier geholfen wird..
Also nochmal danke an alle! :)
Ich denke damit is das Thema erledigt..
LG
Murphy
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 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!