Autor Beitrag
Murphy9904
Hält's aus hier
Beiträge: 14



BeitragVerfasst: Mi 08.09.10 09:47 
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:

user defined image

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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1012
Erhaltene Danke: 24

Windows XP
C#, Visual Studio
BeitragVerfasst: 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ß

Für diesen Beitrag haben gedankt: Murphy9904
Necaremus
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 203
Erhaltene Danke: 18

Win > XP, Vista, 7; Android 2.1
C# > VS '08,'10; Delphi7
BeitragVerfasst: 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 :)

Für diesen Beitrag haben gedankt: Murphy9904
Murphy9904 Threadstarter
Hält's aus hier
Beiträge: 14



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1012
Erhaltene Danke: 24

Windows XP
C#, Visual Studio
BeitragVerfasst: 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.
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 203
Erhaltene Danke: 18

Win > XP, Vista, 7; Android 2.1
C# > VS '08,'10; Delphi7
BeitragVerfasst: Mi 08.09.10 11:20 
ausblenden 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; }+
        //[...] z.B:
        public Types Type { get; set; }
        public enum Types { Project, ProjectGroup }
        

        //cunstructor
        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".

Für diesen Beitrag haben gedankt: Murphy9904
danielf
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1012
Erhaltene Danke: 24

Windows XP
C#, Visual Studio
BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 14



BeitragVerfasst: 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?
ausblenden 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:

ausblenden 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
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: 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.

ausblenden 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.

ausblenden C#-Quelltext
1:
2:
3:
4:
listbox.DisplayMember = "Alias"// oder schon im Designer setzen 

MyListBoxItem item = new MyListBoxItem("mein Name""mein Alias", MyListBoxItem.Types.Project);
listbox.Items.Add(item);

Für diesen Beitrag haben gedankt: Murphy9904
Necaremus
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 203
Erhaltene Danke: 18

Win > XP, Vista, 7; Android 2.1
C# > VS '08,'10; Delphi7
BeitragVerfasst: 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(/*args*/) aufrufst.

prinzipiell würde dir aber ja schon ne klasse mit 2 strings reichen... also
ausblenden 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 Threadstarter
Hält's aus hier
Beiträge: 14



BeitragVerfasst: 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
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: 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.

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
MyListBoxItem item = ListBoxRight.SelectedItem as MyListBoxItem;
if(item != null)
{
   //hier irgendwas wichtiges mit deiner Klasse anstellen
}

Für diesen Beitrag haben gedankt: Murphy9904
Murphy9904 Threadstarter
Hält's aus hier
Beiträge: 14



BeitragVerfasst: 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
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: Mi 08.09.10 13:44 
Zeig mal deinen Code und sag deutlicher was nicht geht.


Ein Code zum verschieben z.B. so

ausblenden 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 Threadstarter
Hält's aus hier
Beiträge: 14



BeitragVerfasst: 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
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: Mi 08.09.10 14:18 
Zitat:
aber da geht es dann nicht wenn man mehrere gleichzeitig verschieben will


Dann halt

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

Für diesen Beitrag haben gedankt: Murphy9904
Murphy9904 Threadstarter
Hält's aus hier
Beiträge: 14



BeitragVerfasst: 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