Hallo zusammen,
ich habe auf einer Form viele Checkboxes, von denen jeweils das CheckedChanged-Event behandelt wird.
Das Problem ist, dass beim Form_Load natürlich nur die Events gefeuert werden, wo sich der Checked-Status beim initialisieren ändert.
Ich möchte allerdings gerne jedes Event einmal feuern, d.h. jede Methode einmal durchlaufen (und natürlich das jeweilige sender-objekt mitliefern)
checkBox1_CheckedChanged(object sender, EventArgs e)
checkBox2_CheckedChanged(object sender, EventArgs e)
checkBox3_CheckedChanged(object sender, EventArgs e)
.
.
.
Muss / kann ich die anzusprechenden Methodennamen dynamisch erzeugen? Wenn ja, wie? Oder hat jemand eine Alternative, für jede CheckBox der Form das dazugehörige Event auszulösen?
Gruß
Carlo
"Palabras que no coinciden con hechos no valen nada."
Die Frage wäre eher, was du damit erreichen willst.
Wenn du schon beim laden des Form einmal das Event feuern musst, klingt das eher nach einem Fehler im Prozess.
Es würde auch nichts dagegen sprechen, wenn du die Methoden im Code einfach selbst aufrufst und als Sender das jeweilige Control mitgibst.
Müsstest du am Ende auch mit dynamischen Code machen, da ist es einfacher die Event Methoden direkt mit entsprechenden Parametern aufzurufen.
Anbei:
Wenn der Code der Methoden identisch ist, kannst du auch eine CheckChanged Methode anlegen und diese allen Controls mitgeben.
Dadurch sparst du dir unnötige Events, die im Kern das gleiche machen.
T-Virus
Developer, Developer, Developer, Developer....
99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.
[FAQ] Variablennamen zur Laufzeit zusammensetzen / Dynamisches Erzeugen von Controls
In Deinem Fall riecht es aber eher danach, dass Du einen Event für alle Controls verwenden kannst und daher der Wunsch nach der Laufzeiterzeugung eher ein Denkfehler ist.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
Naja, ein Denkfehler wäre mir am liebsten. 😉
Im Prinzip sieht es wie folgt aus dahinter:
private void checkBoxVorname_CheckedChanged(object sender, EventArgs e)
{
if (((CheckBox)sender).Checked)
{
this.person.Vorname = this.textBoxVorname.Text;
}
else
{
this.person.Vorname = null;
}
}
(Die Person wird hinterher (teilweise) serialisiert, die Textboxen vorher per BindingSource und BindingNavigator aus einer DB gefüllt.) Im Prinzip könnte ich auch alle CheckBoxen mit einer Methode abfragen, habe aber dann das Namenproblem mit den Textboxen. Und so 20 if-thens übereinander möchte ich vermeiden. Ein Schluss von der CheckBox auf die Textbox gelingt mir nicht. Deren Namen zu vergleichen ist ja auch nicht wirklich schick, oder?
Gruß
Carlo
"Palabras que no coinciden con hechos no valen nada."
Wofür meinst du denn diese Checkbox zu benötigen?
Um auszuwählen, welche Eigenschaften (persönlichen Daten) in das Objekt "Person" übernommen werden sollen und welche nicht, bevor die Person serialisiert wird.
Im Prinzip bräuchte ich sowas wie eine CheckedTextBox.
Gruß
Carlo
"Palabras que no coinciden con hechos no valen nada."
Mach es doch vor dem Serialisieren :
if (checkBoxVorname.Checked) person.Vorname = textBoxVorname.Text; else person.Vorname = null;
if (checkBoxNachname.Checked) person.Nachname = textBoxNachname.Text; else person.Nachname = null;
1 Zeile pro Feld, geht doch.
Natürlich kannst Du auch die Textboxen in einer Schleife durchgehen und die Checkbox dazu abfragen, aber Du musst es ja eh der Klasse zuweisen.
Finde ich auch nicht so elegant.
foreach(Control ctrl in ..Controls)
{
string tb = ctrl.Name;
string cb = ctrl.Name.Replace("textBox","checkBox");
if (tb.Startswith("textBox")) (CheckBox)Controls[cb] ...
}
Grüße Bernd
Workshop : Datenbanken mit ADO.NET
Xamarin Mobile App : Finderwille Einsatz App
Unternehmenssoftware : Quasar-3
Würde ich komplett anders angehen, denn das ist stringfrickelei, die nicht nötig ist.
Erstelle dir ein ViewModel ( kann man auch in Forms benutzen ) mit Selected, Name und Value.
Fülle eine Liste vom ViewModel z.b. per reflection ( GetProperties und getvalue ist ein 2 Zeiler) .
Binde das an ein DataGridView und anschließend brauchst du nur durch die Liste gehen und den umgekehrten Weg gehen.
Ist deutlich weniger Code, wenn Properties hinzukommen oder entfernt werden musst du nichts machen.
Hi, ich weiß ja jetzt nicht, wie es bei dir GUI-Technisch aussieht, aber ich würde mir dafür ein UserControl erstellen (CheckedTextbox). Auf diesem UserControl könnte man links die CheckBox platzieren und den Text dieser auf String.Empty setzen und auf der rechten Seite die Besagte Textbox. Um dann noch auf die Entsprechneden Objekte zugreifen zu können fügst du einfach zwei Eigenschaften ein
[Category("Controls")]
public TextBox Textbox { get => TextBox1; }
[Category("Controls")]
public CheckBox Checkbox { get => CheckBox1; }
oder eben nur die benötigten Eigenschaften der Objekte
[Category("Properties")]
public string Content { get => TextBox1.Text; }
[Category("Properties")]
public bool Checked { get => CheckBox1.Checked; }
Die Vorteile sind:
Man kann es natürlich auch mit Reflection und so lösen, aber ich denke, dadurch sinkt die Wartbarkeit des Codes und das Fehlerpotenzial steigt.