C# Einträge in einer List Box Sortieren

Murphy9904

Lt. Junior Grade
Registriert
Mai 2007
Beiträge
344
Hi,
ich steh vor dem Probelm dass ich die Einträge in einer List Box vom Benutzer sortieren lassen will.
nun weis ich aber garnich wie ich das anstellen soll.
ich könnte ja vielleicht eine Methode schreiben die mir die Einträge alle rauslöscht und dann wieder irgendwie in andrer Reihenfolge reinschreibt aber das würde aufwändig werden..
geht das vielleicht noch irgendwie anders?

Danke schonmal
LG
Murphy
 
also nur aufsteigend und absteigend.
 
ohweh, okay.
gibts denn irgendne Funktion mit der du bei einer Liste und so ein Objekt um eins nach oben/unten zu verschieben?
 
Bei einer normalen List<T> oder was meinst du jetzt?
Wenn du das sortieren meinst, mach das doch ganz einfach über ein list.OrderBy oder direkt über OrderByDescending
 
ich meine wie ich das am besten verwirkliche mit meiner List Box
 
Okay gut, das werde ich dann schon irgendwie hinbekommen
hab ja meinen coolen Freund Google ;)
aber danke dir :)

Fals es irgendwann mal jemanden interresiert, so hab ich das gelöst:
Code:
 {
MyListBoxItem[] AllItemsRight = new MyListBoxItem[ListBoxRight.Items.Count];
ListBoxRight.Items.CopyTo(AllItemsRight, 0);
int SelectedItem = ListBoxRight.SelectedIndex;
var temp = AllItemsRight[(SelectedItem - 1 >= 0) ? SelectedItem - 1 : SelectedItem];AllItemsRight[(SelectedItem - 1 >= 0) ? SelectedItem - 1 : SelectedItem] = AllItemsRight[SelectedItem];
AllItemsRight[SelectedItem] = temp;
ListBoxRight.Items.AddRange(AllItemsRight.ToArray());
ListBoxRight.Items.Clear();
ListBoxRight.Items.AddRange(AllItemsRight);
ListBoxRight.SelectedIndex = (SelectedItem - 1 >= 0) ? SelectedItem - 1 : SelectedItem;
}
 
Zuletzt bearbeitet:
würde das auch anders gehn?
 
ich hab neben der List box 2 buttons, und der Benutzer kann dann ein Objekt aus der List box auswählen, und dieses dann nach oben/unten verschieben (per Klick auf die Buttons)
 
achso,
Das brauche ich dann für was andres..
gehört alles so :P
 
Hi...

ich hatte mal ein gleiches Problem und habe mir dann folgende Methoden erstellt. Ist schon eine Weile her...

Code:
        public enum MoveItem
        {
            Up = 0,
            Down = 1
        }

        #region +HustleItem(ListBox lbx, MoveItem whichWay)
        #region XML-Doku
        /// <summary>
        ///     Verschiebt das ausgewählte Item um eine Stelle des Indexes hoch/runter.
        /// </summary>
        /// <param name="lbx">
        ///     ListBox in der das Item verschoben werden soll.
        /// </param>
        /// <param name="whichWay">
        ///     Gibt an in welche Richtung das Item verschoben wird.
        /// </param>
        #endregion
        public static void HustleItem(ListBox lbx, MoveItem whichWay)
        {
            if (lbx.SelectedItem != null && lbx.SelectedIndex >= 0)
            {
                int index = lbx.SelectedIndex;
                bool delete = false;

                object item = lbx.SelectedItem;

                if (whichWay == MoveItem.Up && index > 0)
                {
                    lbx.Items.Insert(index - 1, item);
                    delete = true;
                }
                else if (whichWay == MoveItem.Down && index < lbx.Items.Count - 1)
                {
                    lbx.Items.Insert(index + 2, item);
                    delete = true;
                }

                if (delete)
                    lbx.Items.RemoveAt(lbx.SelectedIndex);
            }
        }
        #endregion

        #region +DeleteItem(ListBox lbx, Label lblCounter)
        #region XML-Doku
        /// <summary>
        ///     Löscht das ausgewählte Item aus einer ListBox.
        /// </summary>
        /// <param name="lbx">
        ///     Die ListBox in der das Item gelöscht werden soll.
        /// </param>
        /// <param name="lblCounter">
        ///     Welches Label aktualisiert werden soll.
        /// </param>
        #endregion
        public static void DeleteItem(ListBox lbx, Label lblCounter)
        {
            if (lbx.SelectedItem != null)
            {
                DialogResult result = MessageBox.Show("Soll die Auswahl wirklich gelöscht werden?",
                                    DateTime.Now.ToString("dd.MM.yyyy HH:mm:ss") + " - Löschen",
                                    MessageBoxButtons.YesNo, MessageBoxIcon.Question);

                if (result == DialogResult.Yes)
                {
                    if (lbx.SelectedIndex == 0 && lbx.Items.Count == 1)
                    {
                        lbx.Items.RemoveAt(lbx.SelectedIndex);
                    }
                    else if (lbx.SelectedIndex >= 0)
                    {
                        if (lbx.SelectedIndex == lbx.Items.Count - 1)
                            lbx.Tag = lbx.Items[lbx.SelectedIndex - 1];
                        else
                            lbx.Tag = lbx.Items[lbx.SelectedIndex + 1];

                        lbx.Items.RemoveAt(lbx.SelectedIndex);
                    }
                }
            }
        }
        #endregion


Vielleicht hilft es ja... Aber wie immer auch hier wieder:
Erst verstehen und dann benutzen und nicht nur Copy&Paste! ;)
 
Wieso den alles so kompliziert. Es gibt doch SortedList als Object im Collection Namespace.... binde den an deine Liste. Ist doch viel einfacher als zu viel Overhead im Code zu haben!
 
@ HaGGi.13 dein Code ist ja im Prinzip das gleiche was ich habe. Nur würd der für mich nicht gehen weil das objekt ja kurz doppelt exsistiert - oder?
aber bissel was kann ich mir abgucken ;)

schaut jetzt bei mir so aus:
(jetzt versteh ich auch was toeffi mit der extra ListItemColletion gemeint hatte XD)

Code:
 {
int SelectedItem = ListBoxRight.SelectedIndex;
object temp = ListBoxRight.SelectedItem;
ListBoxRight.Items.RemoveAt(SelectedItem);
ListBoxRight.Items.Insert((SelectedItem > 0)?SelectedItem - 1:0,temp);
ListBoxRight.SelectedIndex = (SelectedItem - 1 >= 0) ? SelectedItem - 1 : SelectedItem;
}

@Rocker: versteh ich nich - wie stellst du dir das vor?
 
Zuletzt bearbeitet:
Also der Beste Weg ist immer noch es so zu lösen wie toeffi es schon mal sagte!
Ich habe leider falsch verstanden, was du machen wolltest...
Ich dachte du willst ein Item auswählen und es per Button hoch/runter wandern lassen in der Liste, daher mein Code.
Aber du willst ja die gesamte Liste per Button Des- bzw. Ascading sortieren.

Ich wiederhohle noch mal toeffi... :)
Hol dir die Items von deiner Liste, sortiere sie mit OrderBy, leere deine ListBox und hob die neue sortierte Liste in die ListBox. :)

Jedoch würde an dieser Stelle mich auch rokers Key Vorschlag interessieren.


LG
 
Zurück
Oben