Entwickler-Ecke
WinForms - Dynamische Festlegung von Events zu Objekten
Felix2000 - Mo 22.08.11 14:14
Titel: Dynamische Festlegung von Events zu Objekten
Hi Folks !
Ich versuche gerade Events dynamisch an Objekte zu binden (in diesem Fall Objekte vom Typ Button), d.h. es sollen je nach übergebenen Namen für den Button an die Methode createButton für das jeweilige Buttonobjekt unterschiedliche Events geheftet werden. Diese Anheftung geschieht über die Methode chooseCurrentButtonEvent().
Klappt dieses anheften leider nciht so, wie ich mir das vorgestellt habe. was genau mache ich hier verkehrt? Hier ist mein bisheriger Code:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
| public void createButton(string cmdShowName, string cmdRefName, int cmdXPosition, int cmdYPosition, int cmdXSize, int cmdYSize){ Button btnForm = new Button();
btnForm.Text = cmdShowName; btnForm.Location = new System.Drawing.Point(cmdXPosition, cmdYPosition); btnForm.Name = cmdRefName; btnForm.Size = new System.Drawing.Size(cmdXSize, cmdYSize); btnForm.UseVisualStyleBackColor = true;
chooseCurrentButtonEvent(cmdShowName, btnForm); } |
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35:
| public void chooseCurrentButtonEvent(string cmdShowName, Button btnForm) {
string strCurrentEventHandler = "";
switch (cmdShowName) {
case "Daten anzeigen": btnForm.Click += new System.EventHandler(btnShowDynamicCreation_Click);
private void btnShowDynamicCreation_Click(object sender, EventArgs args) {
MessageBox.Show("Daten anzeigen");
} case "Daten speichern": btnForm.Click += new System.EventHandler(btnSaveDynamicCreation_Click);
private void btnSaveDynamicCreation_Click(object sender, EventArgs args) {
MessageBox.Show("Daten speichern");
}
}
} |
Greetz
Felix
Kha - Mo 22.08.11 14:41
C# kennt wie Java keine verschachtelten Methoden. Ansonsten sehe ich erst einmal nichts Verkehrtes - aber anstatt ein switch über Magic Strings zu benutzen, könntest du den Eventhandler selbst an die Methode übergeben.
Und falls du's trotzdem inline haben willst:
C#-Quelltext
1: 2: 3: 4: 5:
| btnForm.Click += delegate {
MessageBox.Show("Daten anzeigen");
}; |
Felix2000 - Mo 22.08.11 15:10
Hi Folks !
Danke für den Post ! Ok, das wäre eine Möglichkeit das so zu händeln und eigentlich auch eine ziemlich gute. Könnte man das vielleicht auch so gestalten, dass man die Events bzw. die Eventmethoden in eine neue Klasse auslagert, diese Eventmethode dann public und static deklariert und dort abarbeitet?
Das würde, so denke ich zumindest, eine dauerhaft bessere Strukturierung und Kapselung meines Code gewährleisten, wenn dieser anwachsen sollte (was wohl auch zwangsläufig passieren wird). Wenn das möglich wäre, wie genau müsste ich dann bspw. ein Formular hier übergeben? Ich bekomme das nicht hin, da ich die Art der Übergabeparameter noch nciht ganz verstanden habe:
C#-Quelltext
1: 2: 3: 4:
| case "Mache was": btnForm.Click += new System.EventHandler(FormGeneration_Events.btnCloseDynamicCreation_Click 'frmCurrentForm'); break; |
Wie genau kann ich hier Parameter übergeben? Oder geht das gar nicht?
Greetz
Felix
dark-destination1988 - Mo 22.08.11 15:11
das ist ein eventhandler, die methode wird aufgerufen wenn das event eintritt übergeben wird dort meistens (object sender, EventArgs e)
Felix2000 - Mo 22.08.11 15:21
Hi Folks !
Ok das ist mir schon verständlich, wie genau kann ich das aber handhaben, dass wenn in einer der EventMethoden ein Formular geschlossen werden soll? Woher soll die Eventmethode sonst exakt dieses eine Formular kennen?
Greetz
Felix
lothi - Di 23.08.11 14:32
Hallo
Irgendwie kommt mir das sehr kompliziert vor was du da vor hast und ich glaube kaum, dass das Pflegeleichter ist, als eine normale Form zu bauen.
Was bringt dir eine Methode die eine Button erstellt?
Willst du später an dem Button etwas ändern musst eh wieder die Methode in dem Formular ändern!
public void createButton(string cmdShowName, string cmdRefName, int cmdXPosition, int cmdYPosition, int cmdXSize, int cmdYSize)
Macht ja auch nichts anderes als eine normale Buttonklasse.
Wieso überschreibst du nicht den allgemeinen Button? Dann kannst du die Ereignissmethoden überschreiben und so deine Standartfunktionen erstellen.
z.B Button schliessen, Button öffnen... so hast ein Button schliessen der auf jeder Form gleich aussieht, und wenn du die Farbe wechseln willst brauchst du nur die Basisklasse anzupassen swups sind alle Schliessenbutton rot..
Beschriftungen kannst du auch in der Settings Datei ablegen und wenn eine Änderung anfällt diese nur in dieser tätigen.
Gruss Lothi
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!