Laden...

Methodennamen dynamisch erstellen / ansprechen

Erstellt von C4RL0 vor 2 Jahren Letzter Beitrag vor 2 Jahren 534 Views
C4RL0 Themenstarter:in
96 Beiträge seit 2012
vor 2 Jahren
Methodennamen dynamisch erstellen / ansprechen

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."

T
2.224 Beiträge seit 2008
vor 2 Jahren

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.

16.842 Beiträge seit 2008
vor 2 Jahren

[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.

C4RL0 Themenstarter:in
96 Beiträge seit 2012
vor 2 Jahren

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."

F
10.010 Beiträge seit 2004
vor 2 Jahren

Wofür meinst du denn diese Checkbox zu benötigen?

C4RL0 Themenstarter:in
96 Beiträge seit 2012
vor 2 Jahren

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."

3.825 Beiträge seit 2006
vor 2 Jahren

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

F
10.010 Beiträge seit 2004
vor 2 Jahren

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.

N
1 Beiträge seit 2021
vor 2 Jahren

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 das Control beliebig erweitern und wiederverwenden.
  • man muss bei einem Bug oder einem neuen Feature diesbezüglich nicht an 20 sondern nur an 1 Stelle Code ändern.
  • Fehlerpotenzial wird (auch durch vorige Punkte) minimiert.

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.