DropDownList-Elemente sortieren

fabilazar

Mitglied
Hallo,
weiß jmd. vielleicht wie ich meine ddl items sortieren kann, nachdem ich ein neues Element hinzugefügt habe. Kann nichts dazu finden...
Die items sind aber keine Zahlen sondern strings.
Code:
private void Add_Btn_Click(object sender, System.EventArgs e)

{

string versadd = Tb_neu_Vers.Text; //Textbox auslesen

Vers_Menu.Items.Add(versadd); //string zu ddl hinzufügen
 
//so wird das item nur ans Ende hinzugefügt, ich hätts aber gerne nach der Reihenfolge 1.0, 4.1, 5.0, 5.1, 10.1 usw.


}
Hat jmd eine Idee.
Gruss
fabi
 
Hallo,

frei nach dem Motto "wenns das nicht gibt entwickel es neu":

Versuch doch mal, selbst einen Sortieralgorithmus unterzubringen. Also nicht nur mit Add einfügen sondern folgende Methode ausführen:

Code:
void AddToSortedList(ref DropDownList ArrayToSort){
  //Auslesen aller Elemente der DropDownList, einfügen in ein Array
  
  //Sortieren deArrays mit QuickSort oder BubbleSort oder ähnlichem

  //Elemente der nun sortierten Liste in DropDown einügen
}

Das funktioniert mit Sicherheit! Viel Spass beim Implementieren!

Gruß

Alex
 
okay ich habs versucht, leider nur mit mäßigem Erfolg :(

Ich bin so vorgegangen:
Zuerst habe ich die ddl befüllt (ist bereits sortiert da die Verzeichnisse so autom. angelegt werden),
Dann will ich eine neue Version hinzufügen über den Button und die Textbox (Versionsname).
Code:
private void Add_Btn_Click(object sender, System.EventArgs e)

{

string versadd = Tb_neu_Vers.Text;

Vers_Menu.Items.Add(versadd);

SaveVersion();

string path = Server.MapPath("/Testformular/Caly/Spezifikation/Version/");

DirectoryInfo di = new DirectoryInfo(path);

DirectoryInfo [] sort = di.GetDirectories();

SortedList(sort);



FillDropDownListVers();

}
 
private string SaveVersion()

{

string filename = Server.MapPath("/Testformular/Caly/Spezifikation/Version/");

string versionsnr = Tb_neu_Vers.Text;

string ordner = filename+versionsnr;

if (CreateDirectory(ordner)) //hier wird das Verzeichnis erstellt, das klappt

return ordner;

return null;

}
 
private void SortedList(DirectoryInfo [] versions)

{

//Array name_subdir=Array.CreateInstance(typeof(String));



string [] name_subdir= new string [] {};

//versions.CopyTo(name_subdir,0); 

 for (int i=0; i < versions.Length; i++)

{

name_subdir[i] = versions[i].Name; //Fehlermeldung Index außerhalb des Arraybereichs

}

Array.Sort(name_subdir, Comparer.Default);

}

Das klappt noch nicht ganz. Kann mir jmd. helfen Verbesserungsvorschläge?
Gruss
 
Hi.

Basierend auf den Artikel
Sort Method for an ASP.NET DropDownList
hab ich diesen Code dort nach C# übertragen.

Code:
using System;
using System.Collections;
using System.Web.UI.WebControls;


public class ListItemComparer : IComparer
{
  public int Compare(object x, object y)
  {
    ListItem i_x = (ListItem) x;
    ListItem i_y = (ListItem) y;
    CaseInsensitiveComparer comp = new CaseInsensitiveComparer();
    return comp.Compare(i_x.Text, i_y.Text);
  }
}

public class Test
{
  public static void Main(String[] args)
  {
    ListItemCollection col = new ListItemCollection();
    col.Add("5");
    col.Add("2");
    col.Add("3");
    col.Add("1");

    Print(ref col);
    Sort(ref col);
    Print(ref col);
  }
  
  public static void Sort(ref ListItemCollection col)
  {
    ListItem[] arr = new ListItem[col.Count]; 
    for (int i = 0; i < col.Count;  i++)
      arr[i] = col[i];

    Array.Sort(arr,new ListItemComparer());

    col.Clear();
    col.AddRange(arr);  
  }

  public static void Print(ref ListItemCollection col)
  {
    for (int i = 0; i < col.Count; i++)
      Console.WriteLine("#{0:00} - {1}", i, col[i]);
  }
}

Wichtig bei diesem Code ist die ListItemComparer Klasse, und das du die Elemente zuerst in ein Array zusammenfasst. =)

(Die ListItemCollection ist bei dir die Eigenschaft Items bei der DropDownList)

MfG,
Alex
 
Hi Alex,

danke für deine Hilfe!
Das einzige was mir noch Probleme bereitet ist die ListItemCollection.
Ich muß die mit den Items aus der ddl befüllen... nur wie?

string versadd = Tb_neu_Vers.Text;
ListItemCollection col = new ListItemCollection();
for (int i=0; i < Vers_Menu.Items.Count; i++)
col.Add(...)
col.Add(versadd); //neu hinzugefügte Version aus der tb ausgelesen
Sort(ref col);
FillDropDownListVers()

Gruß
fabi
 
Du brauchst keine eigene neue ListItemCollection. Deine DropDownList hat so ein Ding schon, und zwar die Eigenschaft namens "Items".
Einfach mal die Members von DropDownList in der MSDN anschauen. ;)
 
meinst du das so?
for (int i=0; i < Vers_Menu.Items.Count; i++)
{
Vers_Menu.Controls.Add(i);
}
falls es das ist was du meinst, dann bringt mir das nichts, weil meine ddl schon gefüllt ist und nur noch um einen Eintrag erweitert u. sortiert ausgegeben werden soll.
Gruss
fabi

 
Hi.

Nein, meine ich nicht so.

Wenn du meine Sort-Methode übernimmst, bzw. eine ähnliche schreibst brauchst diese nur so anwenden:
Code:
Sort(ref myDropDownList.Items);

Und schon ists alphabetisch sortiert.

Diese Items-Eigenschaft der DropDownList ist schon eine ListItemCollection.

MfG,
Alex
 
Okay, danke für deine Tipps und die Geduld, ich glaube ich hab das vorhin nicht so ganz gerafft, aber jetzt weiß ich was du meintest. Wenn du wüßtest wie kompliziert ich gedacht habe, dann würdest du dich an Kopf fassen :)
Zum Schluß noch eine simple Frage wenn ich die Sort-Methode so aufrufe:
Sort(ref Vers_Menu.Items);
dann übergebe ich doch die ddl samt Inhalt an Sort.
public void Sort(ref DropDownList Vers_Menu.Items)
Dann bekomme ich ein Haufen Fehler
?
Mir ist klar dass das so nicht gehen kann, aber ich will doch nicht eine neue variable einer ddl-Klasse anlegen diese befüllen und dann einfach mit Sort(myddl) an Sort übergeben. Kannst du mir noch mal helfen
Gruss
 
Ähhh...

Sort(ref Vers_Menu.Items);
dann übergebe ich doch die ddl samt Inhalt an Sort.
public void Sort(ref DropDownList Vers_Menu.Items)

Was machst du?

Vorallem deine letzte Code Zeile. Du hast da Methoden-Header mit Methoden-Aufruf gemischt. "Vers_Menu.Items" - Vers_Menu ist ja eine Instanz von DropDownList und Items eine Eigenschaft davon.

Zeig vielleicht mal den Code den du momentan verwendest.
 

Neue Beiträge

Zurück