Autor Beitrag
Felix2000
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 124



BeitragVerfasst: Mo 22.08.11 14:14 
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:

ausblenden 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;
             

             //Festlegung des entsprechenden Events für den aktuellen Button
             chooseCurrentButtonEvent(cmdShowName, btnForm);
           
                            
        }


ausblenden volle Höhe 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:
        //Festlegung der Events für die Buttonschaltflächen
        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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: 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:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
                    btnForm.Click += delegate {

                        MessageBox.Show("Daten anzeigen");

                    };

_________________
>λ=
Felix2000 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 124



BeitragVerfasst: 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:

ausblenden 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


Zuletzt bearbeitet von Felix2000 am Mo 22.08.11 15:19, insgesamt 1-mal bearbeitet
dark-destination1988
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 178
Erhaltene Danke: 21



BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 124



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 114
Erhaltene Danke: 3



BeitragVerfasst: 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