DropDownList-Elemente sortieren

okay, hier ist das Meisterwerk :)

Code:
private void Add_Btn_Click(object sender, System.EventArgs e)
{
string versadd = Tb_neu_Vers.Text;
Vers_Menu.Items.Add(versadd);

Sort(ref Vers_Menu.Items);
}
 
public void Sort(ref Vers_Menu.Items)
{
ListItem[] name_subdir = new ListItem[Vers_Menu.Items.Count]; 
for (int i = 0; i < Vers_Menu.Items.Count; i++) 
naja usw. weißt ja...
 
Warum hast denn das Sort nciht so gelassen wie ich es gemacht habe? Habs doch genau so geschrieben das es für dich funktioniert. Hab mir nur keine DropDownList erstellt weil ich das in einer Konsolen-Anwendung getestet habe, und die Items-Collection ja ausreicht.

Falsch:
Code:
public void Sort(ref Vers_Menu.Items)

Vers_Menu ist wie gesagt eine Instanz, und Instanzen haben in Parameter-Definitionen nichts zu suchen.

Richtig:
Code:
public void Sort(ref ListItemCollection col

Typ und Variablennamen - Die Instanz davon übergibst eh beim Parameter aufruf.

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.

Du musst aber eine neue Variable anlegen. Diese Variable ist aber eh nur ein Verweis auf die eine DropDownList bzw. deren ListItemCollection. Und durch das "ref" wurde sogar nochmal explizit angegeben, das eine Referenz übergeben werden soll.
 
Naja, weil du gesagt hast dass ich keine ListItemCollection brauche. Also dachte ich ich muß die Methode abändern. War wohl ein Missverständnis...
Okay, ich lass die Sort-Methode so wie du sie gemacht hast.
Die Ausgangs-Methode ist aber noch falsch..

private void Add_Btn_Click(object sender, System.EventArgs e)
{
DropDownList ddl= new DropDownList();
string versadd = Tb_neu_Vers.Text;
Vers_Menu.Items.Add(versadd);
for (int i=0; i < Vers_Menu.Items.Count; i++)
{
ddl.Items.Add(i);
}
Sort(ref ddl.Items);
}
Ist eigentlich genau dasselbe wie vorhin mit Vers_Menu....
 
Ehrlich gesagt steh ich grad auf dem Schlauch.

Ich will doch nur meine ddl an die Sort-methode übergeben
Also wenn ich das richtig verstanden hab, muss das so ungefähr gehen.
private void Add_Btn_Click(object sender, System.EventArgs e)
{

DropDownList ddl;

string versadd = Tb_neu_Vers.Text;

Vers_Menu.Items.Add(versadd);

ddl = Vers_Menu.Items; //falsch



Sort(
ref ddl); //falsch
}
 
Oke.

Nochmal neu.

# Vers_Menu - Das ist der Name deiner DropDownList, oder? Wenn ja, sehr gut. ;)

Vers_Menu.Items.Add(versadd); - Du fügst ein neues Element hinzu.

Du musst aber bedenken. Das DropDownList ist einfach nur ein Control, und zum Speichern benutzt es eine ListItemCollection. Diese Collection hat bei der DropDownList-Instanz den Namen Items.

Vers_Menu.Items.Add(versadd) fügt also dieser ListItemCollection einen neuen Eintrag hinzu, welcher dann vom DropDownList Control angezeigt wird.
Was du sortieren willst, sind die Elemente welche das DropDownList anzeigt, also die ListItemCollection.

Deswegen fordert die Sort-Methode auch ein Objekt vom Typ ListItemCollection, damit es alle ListItemCollections sortieren kann, und nicht die Elemente von DropDownLists.

Code:
private void Add_Btn_Click(object sender, System.EventArgs e)
{
  string versadd = Tb_neu_Vers.Text;
  Vers_Menu.Items.Add(versadd);
  Sort(ref Vers_Menu.Items); // richtig!
}

Das würde also funktionieren. (Angenommen Vers_Menu ist das DropDownList-Control)
 
hallo Alex,
so hatte ich es schon, da bekam ich aber ne Fehlermeldung. Leider (;)) bin ich nicht mehr im Geschäft und kann es nicht ausprobieren, aber ich glaube dass ich es so hatte. Na wie auch immer, ich werde es nach dem Urlaub ausprobieren (Oder vielleicht auch nach Weihnachten zuhause mal).
Auf jeden Fall ist hat mir genau dieser Gedanke gefehlt. Ich wollte immer die Einträge in meiner ddl sortieren, hab mich aber zu sehr an der Oberfläche orientiert (dabei kann ich es gar nicht an der Oberfläche sortieren :eek:, deshalb kam ich auch auf keinen grünen Zweig) und wusste auch gar nicht dass das Speichern die ListItemCollection übernimmt.
Naja schonwieder was gelernt, danke vielmals für dein support
Frohe Weihnachten!
Viele Grüße
fabi

Vers_Menu ist meine Ddl, ist richtig.:)
 
Das Problem besteht immer noch. Ich habs befürchtet.
Der Compiler meckert an der Stelle
Sort(
ref Vers_Menu.Items);

Fehlermeldung: Eine Eigenschaft oder ein Indexer können nicht als Ausgabe- oder Verweisparameter übergeben werden.

Wenn ich ref im Methodenaufruf weglasse meckert der Compiler noch mehr.
 
Ich habe es umgeändert. Statt der Referenz übergebe ich ein Feld.
die ddl wird aber auch so nicht sortiert, da noch was fehlt
Hier der Code:
Code:
private void Add_Btn_Click(object sender, System.EventArgs e)
{
string versadd = Tb_Neu_Vers.Text;
Vers_Menu.Items.Add(versadd);
Save_AddedVersion(sender, e);
 
ListItem [] array = new ListItem[Vers_Menu.Items.Count];
Vers_Menu.Items.CopyTo(array,0);
Sort(array);
 
public static void Sort(ListItem [] ddlarray)
{
ListItem[] arr = new ListItem[ddlarray.Length]; 
for (int i = 0; i < ddlarray.Length; i++)
arr[i] = ddlarray[i];
 
Array.Sort(arr,new ListItemComparer());
int len = ddlarray.Length;
Array.Clear(ddlarray, 0, len-1);
for(int i = 0; i < arr.Length; i++)
{
ddlarray[i]=arr[i];
}
}
das ist jetzt nur ein array, das müßte ich aber noch in meine ListItemCollection kopieren, die meine ddl verwaltet, hat einer eine Idee?
 
Du könntest den Rückgabewert der Sort-Methode ändern, auf ListItem-Array, beim Aufruf von Sort den Rückgabewert in eine Variable geben, danach alle Items des DropDowns löschen (Clear Methode), und danach mit AddRange das Array hinzufügen.

Bei meiner Sort-Methode wäre das schon drinnen. Könntest dort nachsehen was ich meine.
 
Zurück