Sender Tag auswerten
-
Vielen Dank an Th69, denn ich habe es jetzt ähnlich wie er gelöst.
Label label = sender as Label; int Tag; string sTag = label.Tag as string; int32.TryParse(sTag, out Tag);
Firefighter schrieb:
Ich persönlich finde es äußert fragwürdig in der Tag-Eigenschaft was zu speichern.
Warum? Wie würdest du es machen wenn du eine Ereignissmethode für verschiedene Steuerelemente hättest, die Ereignissmethode aber mit if änderbar sein muss?
-
Warum?
- Weil ich der Meinung bin das diese umhercasterei recht gefährlich ist.
- Weil man mal schnell was vergessen kann wenn sich an den Tags was ändert oder wenn neue Labels hinzukommen.Wie würde ich es machen:
- Naja, du könntest es über Bindings machen.
- Oder du könntest die Labels im Code erzeugen, über eine Schleife und im Code anonyme Eventhandler anlegen und mit den erzeugten Indizies arbeiten.Da wir aber nicht wissen was du vorhast, können meine Ideen genauso gut fürn Müll sein
-
Hobby_Programmierer schrieb:
Vielen Dank an Th69, denn ich habe es jetzt ähnlich wie er gelöst.
Label label = sender as Label; int Tag; string sTag = label.Tag as string; int32.TryParse(sTag, out Tag);
Wenn du schon mit "as" arbeitest, prüfe auch auf null, sonst hat das ganze keinen Sinn.
Wenn du es nicht machst, knallt es bei der ersten Verwendung direkt mit einer NullReferenceException weg.Nur die Verwendung von "as" macht es nicht auf Magische Weise sicher.
Unabhängig davon finde ich die Verwendung des Tags auch sehr Fragwürdig.
Erstell doch eine Methode pro Steuerelement, die rufen dann die Eigentliche Methode mit einem Parameter auf.
Dadurch entkoppelst du auch die UI von der Logik etwas.
-
@David W
bei as auf null zu prüfen ist sinnlos, da ich die Tags im Designer eingebe und im Programm nie ändere@David W und Firefighter
Ich programmiere ein Tic Tac Toe. Da jedesmal etwas ähnliches passieren muss, aber doch nicht gleich (wie muss der Computer reagieren...) sind mir die Tags angenehm.PS: Ich zwinge niemanden auch Tags zu benuzten!
-
Hobby_Programmierer schrieb:
@David W
bei as auf null zu prüfen ist sinnlos, da ich die Tags im Designer eingebe und im Programm nie ändereDann brauchst du es auch nicht mit "as" casten sondern kannst hart casten wie du es zuvor hattest.
Dann sparst du dir den Runtime Typecheck.
-
Hobby_Programmierer schrieb:
@David W
bei as auf null zu prüfen ist sinnlos, da ich die Tags im Designer eingebe und im Programm nie ändere@David W und Firefighter
Ich programmiere ein Tic Tac Toe. Da jedesmal etwas ähnliches passieren muss, aber doch nicht gleich (wie muss der Computer reagieren...) sind mir die Tags angenehm.PS: Ich zwinge niemanden auch Tags zu benuzten!
Ok jedem das seine
-
Tja, wir als Profi-Progger würden sowas nie benutzen.
-
Es ist eher eine Frage des Stils und was man für Ansprüche an sich selber hat.
Ein guter Stil ist es mMn nicht. Projekte die ich selber schreibe sollen meinen eigenen Ansprüchen genügen (was sie allerdings selten schaffen, da ich sehr selbstkritisch bin).
-
Firefighter schrieb:
Ich persönlich finde es äußert fragwürdig in der Tag-Eigenschaft was zu speichern.
Dem stimme ich zu.
Warum verarbeitest Du nicht den Namen der 9 Labels.
Ich sehe da keinen Sinn "Tag" zu verarbeiten.
Label label = sender as Label; MessageBox.Show(label.Name);
Die Abfrage welches Label geklickt wurde, machst Du über eine if-Anweisung oder einer switch-case-Anweisung...
Label label = sender as Label; switch (label.Name) { case "label1": MessageBox.Show("1"); break; case "label2": MessageBox.Show("2"); break; default: MessageBox.Show("3"); break; }
-
var allLabels = { label1, label2, label3, ..., ... }; for(int i = 0; i < allLabels.Count; ++i) { int labelIndex = i; allLabels[i].OnClick = (eventArgs) => ProcessLabelClick(labelIndex); }
-
Sorry kleinere Fehler im vorherigen Beispiel. So könnte man mit einer Funktion alle Labels verarbeiten anhand des Index.
void ProcessLabelClick(int i) { MessageBox.Show(i.ToString()); } var allLabels = new List<Label> { label1, label2 }; for (int i = 0; i < allLabels.Count; ++i) { int labelIndex = i; allLabels[i].Click += (sender, eventArgs) => ProcessLabelClick(labelIndex); }
-
Mit einer normalen Klick Methode ginge es nach diesen Prinzip auch, da man den Sender dann mit IndexOf in der Liste suchen kann und dann den Index bekommt.
-
@guten tag und David W
Was ist denn so schlimm?
Und was ist der Unterschied ob ich Tag oder Name benutze?
Und vorallem: bei Name kann ich nicht nur eine Zahl eingeben, ich will es aber direkt im Index eines Arrays weiterverwenden.
-
Was ich daran schlimm finde? Die enge Kopplung zwischen Programmlogik und Oberfläche.
Den Namen zu verwenden finde ich genauso falsch.
-
David W schrieb:
Den Namen zu verwenden finde ich genauso falsch.
Ich habe seinen "Tag-Wert" völlig falsch verstanden. Habe es so verstanden, dass die auch mit "lbl0 - lbl8" gefüllt sind, dieses würde nun absolut keinen Sinn machen.
-
In die Tag Eigenschaft von lbl0 schreibe ich 0.
In die Tag Eigenschaft von lbl1 schreibe ich 1.
In die Tag Eigenschaft von lbl2 schreibe ich 2.Dann konvertiere ich den Tag in ein int, um ihn als Arrayindex zu verwenden. Wenn hierfür jemand was schöneres hat, bin ich für Anregungen dankbar.
-
-
Auch wenn ich 13 Jahre und auf dem Gymnasium bin, reicht mein Englisch dafür noch nicht.
Könnte mir jemand bitte eine Kurzform dieser Seite geben?
-
Nee sorry, davon gibts keine Kurzform.
Aber du kannst dein Englisch so trainieren wenn du versuchst es zu verstehen.
-
Du hast die MSDN doch sicherlich auch bei dir lokal installiert (und dann in deutsch), oder? Und wenn nicht dann ersetze einfach im Link "en-us" durch "de-de" - voilà.
Aber laß dich nicht von den anderen verunsichern, dein Ansatz mit dem "Tag" ist schon in Ordnung so.
Ansonsten kannst du dir auch mal diesen FAQ-Beitrag vom myCSharp-Forum durchlesen: Variablennamen zur Laufzeit zusammensetzen.