C# ListBox + RadioButtons Kombi

Sparkley

Ensign
Registriert
Feb. 2009
Beiträge
249
Guten Tag,

ich habe gerade ein Problem was ich mit meinen beschränkten Wissen aktuell nicht bewältigen kann und könnte etwas Hilfe gebrauchen. Ich habe das Theoretische Wissen mir angeeignet über die einzelnen Funktionen der Steuerelemente (RadioButtons/ListBoxen z.B) aber ich habe sie noch nie so kombiniert und stoße da auf ein Hinderniss. ich benutze Visual Studio 2013 Express Edition....

ich habe das einmal Grafisch aufbereitet zur besseren verständnis.

5x ListBoxen , 4x RadioButton, 1x cmdButton
Neue Bitmap.jpg
Meine Aufgabe:
ich möchte jeweils das makierte Element aus dem lstVerteiler einem der anderen vier lstEins bis lstVier zuweisen indem man den dazugehörigen Radiobutton aktiviert und dann auf Zuordnen drückt. Danach soll das Element aus dem lstVerteiler gelöscht sein bzw verschoben sein. der Verteiler brauch keine möglichkeit besitzen von den anderen Vier lst wieder gefüllt zu werden.


Einer meiner ideen sah so aus:

private void cmdZuordnen_Click (...)
{
if (optVier.Checked == true && lstVerteiler.SelectedIndex > -1)
lstVier.Insert(0, lstVerteiler.SelectedItem)
lstVerteiler.RemoveAt(lstVerteiler.SelectedItem);
else if
.....
//dann das selbe verfahren für die anderen drei RadioButtons/Listboxen


Das war mein Lösungsansatz aber wie es unschwer zu erraten ist , er funktioniert leider nicht. Ich würd mich über konstruktive Kritik oder Verbesserungsvorschläge sehr freuen.
 
Zuletzt bearbeitet:
Kann dir die Lösung nicht verraten, aber würde dir empfehlen, statt "klappt nicht" einfach mal zu sagen, was denn tatsächlich passiert.

Damit mein Post dir trotzdem schonmal einen gewissen Mehrwert bietet, obwohl ich kein C# kann, möchte ich dir noch einen Tip geben, wie du die von dir beschriebene mehrfache Wiederholung des selben Codes vermeiden kannst. Das ist zwar nicht der Grund für dein Problem, aber wenn du eine Lösung gefunden hast, wird es für dich einfacher, sie umzusetzen.

Pseudocode:

Code:
Array ZielListe = { IstEins, IstZwei, IstDrei, IstVier };
Array CheckListe = { optEins, optZwei, optDrei, optVier };

if(IstVerteiler.SelectedIndex < 0) return;

for(i = 0 .. Arraygröße(Checkliste)) {
    if(Checkliste[i].Checked = true) {
        ZielListe[i].Insert(i, IstVerteiler.SelectedItem);
        IstVerteiler.RemoveAt(IstVerteiler.SelectedItem);
        break;
    }
}

So musst du deine Änderung nur noch einmal machen und alle Fälle sind abgedeckt. Wenn du nicht verstehst, was ich mit der Beschreibung ausdrücken soll, ignorier den Vorschlag einfach, statt dir unnötig Gedanken darüber zu machen, weil es dein eigentliches Problem ja nicht betrifft.

Dann noch: Wie gesagt, kann ich kein C#, aber in vielen Sprachen ist = der Zuweisungsoperator und der Vergleichsoperator heißt ==. Vielleicht ist das schon genau der Grund für dein Problem.
 
asdfman schrieb:
Kann dir die Lösung nicht verraten, aber würde dir empfehlen, statt "klappt nicht" einfach mal zu sagen, was denn tatsächlich passiert.

Damit mein Post dir trotzdem schonmal einen gewissen Mehrwert bietet, obwohl ich kein C# kann, möchte ich dir noch einen Tip geben, wie du die von dir beschriebene mehrfache Wiederholung des selben Codes vermeiden kannst. Das ist zwar nicht der Grund für dein Problem, aber wenn du eine Lösung gefunden hast, wird es für dich einfacher, sie umzusetzen.

Pseudocode:

Code:
Array ZielListe = { IstEins, IstZwei, IstDrei, IstVier };
Array CheckListe = { optEins, optZwei, optDrei, optVier };

if(IstVerteiler.SelectedIndex < 0) return;

for(i = 0 .. Arraygröße(Checkliste)) {
    if(Checkliste[i].Checked = true) {
        ZielListe[i].Insert(i, IstVerteiler.SelectedItem);
        IstVerteiler.RemoveAt(IstVerteiler.SelectedItem);
        break;
    }
}

So musst du deine Änderung nur noch einmal machen und alle Fälle sind abgedeckt. Wenn du nicht verstehst, was ich mit der Beschreibung ausdrücken soll, ignorier den Vorschlag einfach, statt dir unnötig Gedanken darüber zu machen, weil es dein eigentliches Problem ja nicht betrifft.

Dann noch: Wie gesagt, kann ich kein C#, aber in vielen Sprachen ist = der Zuweisungsoperator und der Vergleichsoperator heißt ==. Vielleicht ist das schon genau der Grund für dein Problem.


Danke für dein Feedback , ich lerne nach dem buch Einstieg in Visual C# 2013 von dem Verlag GalileoComputing habe aktuell erst 130/550 seiten absolviert und habe mir diese Aufgabe ausgedacht um mein erworbenes wissen über die Steuerelemente alle mal miteinander zu verbinden. Leider gab es dann die beschriebenen schwierigkeiten. Ich hab das Buch schon etwas angeschaut was noch kommen wird aber die vorgeschlagenes Array kommen erst in ein folge folge Kapitel. Das mit dem = und == habe ich korrigiert

Edit: Es ist nun zu spät/früh, ich werde mich morgen wieder dransetzen und vieleicht mit einem wachen Verstand finde ich einen neuen Ansatz. Ich werd morgen mal die Fehlermeldung Posten, habe leider den Codeblock gelöscht gehabt
 
Zuletzt bearbeitet:
Ich tippe mal auf ein Problem mit der RemoveAt-Methode.

In dem Beispiel von asdfman ist übrigens ein Fehler. Tipp: Einfach das "= true" bzw. "== true" weglassen.
 
RemoveAt erwartet einen Listen-Index (z. B. SelectedIndex). Du übergibst aber ein Listen-Element (SelectedItem). Dafür gibt es die Methode "Remove".

Also entweder:
Code:
IstVerteiler.Remove(IstVerteiler.SelectedItem);
oder
Code:
IstVerteiler.RemoveAt(IstVerteiler.SelectedIndex);

Außerdem:
Code:
if(Checkliste[i].Checked = true) {
Wird (anders als in C/C++) in C# nicht kompilieren, da die Bedingung eines if immer ein Boolscher Ausdruck sein muss. In C/C++ ist alles != 0 automatisch true, während C# diese Konvertierung nicht automatisch macht.
 
Das Wichtigste ist ja bereits gesagt, der von dir angeschlagene Weg ist soweit auch in Ordnung. Kleine Anmerkung sei dann, dass laut MSDN die RadioButton.Checked-Eigenschaft vom typ bool ist nicht von ?bool, damit müsste sich der Vergleich auf true/false erübrigen. Bin mir da aber nicht 100%-Sicher, da ich mit WinForms nichts am Hut habe :). Weiß jetzt nicht, ob der Code in deinem Post nur eine Idee war, oder ob er kopiert war. Für den zweiten Fall müsste man dann noch anfügen, dass du auf die Einträge in einer ListBox mit ".Items" zugreifst.
Code:
private void cmdZuordnen_Click (/*...*/)
{
     /*Möglicherweise direkt auf SelectedIndex schauen, dass
        könnte im Fall der Fälle unnötige Abfragen erübrigen*/
     if (optVier.Checked && lstVerteiler.SelectedIndex > -1) 
     {
         lstVier.Items.Add(lstVerteiler.SelectedItem);
         lstVerteiler.Items.Remove(lstVerteiler.SelectedItem); 
     }
}
Im Sinne des Programmes könnte man auch darüber Nachdenken den SelectionMode der ListBox auf Multiple zu stellen. Dann müsste man das eben für alle Items machen. Ansprechbar über ".SelectedItems" :).

Beste Grüße und Viel Erfolg beim lernen.
 
Darlis, TheCadillacMan:

Fehler? Wird nicht kompilieren? Habt ihr mein Post überhaupt gelesen? Da steht eindeutig, dass ich kein C# kann und dass es Pseudocode zur Veranschaulichung einer Vereinfachung ist. Habe nie behauptet, das sei in irgendeiner Sprache korrekt oder kompilierbar. Und in Caddymanns Post ist auch ein Fehler! Eine Sprache, die C/C++ heißt, gibt es nämlich gar nicht!

Edit: Und übrigens ist das ein boolescher Ausdruck, denn er wird zu einem Vergleich evaluiert und nicht zu einem numerischen Wert, wie du behauptest. Keine Ahnung, wie du darauf gekommen bist.
 
Zuletzt bearbeitet:
Ach ich hab's dir nicht übel genommen, wollte das nur klar stellen.
 
Der Hinweis von TheCadillacMan denke ich mal war der entscheidende, ich wusste das nicht Remove für SelectedItem und RemoveAt für SelectedIndex gedacht war.

Ich hab es jetzt noch nicht ausprobiert aber ich werde mich nun dran setzen und im späteren verlauf des tages hier nochmal diesen beitrag editieren ob es geklappt hat oder nicht.

soweit erstmal: Danke an der beteildigung zur Lösung meines Problems. :)


Nach meinem Test kann ich nun Erfolg vermelden, der Lösungsansatz mit RemoveAt bzw Remove war der Fehler! Nun funktioniert es.
 
Zuletzt bearbeitet:
Warum wird überhaupt noch Win Forms eingesetzt? Mit WPF und dem MVVM-Pattern kann man doch alles bequem an Models binden und sich voll auf die Logik konzentrieren.
 
Zurück
Oben