Announcement

Collapse
No announcement yet.

Variable an Button.Click Event übergeben

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Variable an Button.Click Event übergeben

    Hallo,
    ich habe ein Programm mit u. A. Buttons, welche bei Klick das Button.Click Event ausführen.

    Nun habe ich ein Problem. Mir wäre es sehr wichtig, dass ich zusätzlich, zu dem Sender und dem EventArgs e Parameter, weitere Variablen an dieses Event bei Aufruf übergeben könnte, allerdings weiß ich nicht, wie ich das anstellen soll.

    also z. b.

    this_button.Click += new System.EventHandler(button_click(int number));


    public void button_click(object sender, EventArgs e, int number)
    {}

    dieses Beispiel funktioniert natürlich nicht, aber ich würde gerne erreichen, dass ich dann neben dem sender und dem e auch die number noch zur Verfügung hätte.

    ich habe mal was von delegates gelesen, allerdings waren die Ansätze, die ich gefunden habe, relativ kompliziert und ich weiß auch nicht, ob dies überhaupt der richtige Ansatz wäre.

    für eure hilfe bin ich sehr dankbar.

    mfg

  • #2
    Hast du den einen eigenen Button der beim feuern des Events auch den zusätzlichen Wert mit an diesen EventHandler übergeben würde? Wenn du die Event Schnittstelle änderst musst du natürlich beide enden (denjenigen der den Event wirft und der den ihn fängt) entsprechend anpassen. Nur weil du die Methodensignatur änderst wird der Button ja nicht anfangen deine gewünschten Daten da rein zu schreiben.

    Dazu von Button ableiten und OnClick überschreiben. In OnClick dann den Event so werfen wie du ihn brauchst. Der übliche Weg wäre dabei von EventArgs abzuleiten und deine zusätzlichen Informationen in der EventArgs Ableitung unterzubringen. Von der EventHandler Signatur (also sender, eventArgs) abzuweichen ist eher unglücklich.

    Comment


    • #3
      hallo,
      danke für deine antwort. leider bin ich in sachen eventsteuerung nicht sehr erfahren (bisher immer die standard events genutzt) und deswegen verstehe ich das nicht so ganz, was du geschrieben hast.

      könntest du mir, falls es nicht zu viel mühe macht, ein kleines beispiel schreiben, wie die onclick event klasse dann überschrieben wird bzw. wie das dann funktionieren soll?

      danke.

      Comment


      • #4
        [Highlight=C#]
        // Der abgeleitete Button
        public class MeinLieberButton : Button
        {
        protected override void OnClick(EventArgs e)
        {
        MeineLiebenEventArgs args = new MeineLiebenEventArgs() { Number = 17 }; // übergeben args ignoriert enthalten eh keine Daten
        base.OnClick(args); // wirft den Event nun aber mit args anstatt e
        }
        }

        // Die neu zu werfende EventArgs Klasse des Click Events
        public class MeineLiebenEventArgs : EventArgs
        {
        public int Number { get; set; }
        }

        // Benutzung im EventHandler, Verdrahtung wie immer
        private void meinLieberButton1_Click(object sender, EventArgs e)
        {
        MeineLiebenEventArgs args = e as MeineLiebenEventArgs;
        if (args != null)
        {
        MessageBox.Show(args.Number.ToString()); // irgendwas sinnvolles
        }
        }
        [/Highlight]

        Comment


        • #5
          Im Beispiel habe ich ja einen neuen 'MeinLieberButton' Button angelegt. Nur der benutzt MeineLiebenEventArgs als EventArgs. Wenn du weiterhin den alten Buttons verwendest bekommst du natürlich auch das alte Verhalten und nur EventArgs von deinem Event zurück und nicht MeineLiebenEventArgs.

          Comment


          • #6
            ja, du hast recht. hab noch n bisschen rumprobiert und jetzt funktionierts bei mir auch.

            danke
            Zuletzt editiert von Stash; 17.01.2011, 16:35.

            Comment


            • #7
              hallo nochmal,

              danke für deine hilfe.

              jetzt hätte ich allerdings noch eine weitere frage. statt der Variable Number den festen Wert von 17 zu übergeben, würde ich der Variable Number gerne eine Variable vom Typ int übergeben, die ich während des Programmbetriebs deklariere.

              Schlussendlich wollte ich erreichen, dass ich eine Variable vom Typ int habe, das Event ausgeführt wird, ich übergebe die Variable an das Event, das Event macht irgendwas mit der Zahl (Variable) und nach Beendigung des Events habe ich den veränderten Wert der Zahl und kann mit diesem Wert weiterarbeiten.

              ich will die variable nicht als public deklarieren oder sowas. und schlussendlich müsste ich sie dann mit ref übergeben, dass ich mit dem veränderten wert weiterarbeiten kann.

              wie kann ich das machen?

              vielen dank für deine hilfe.

              Comment


              • #8
                Ich weiß nicht was das soll. Ich vermute mal das das was wir bisher gemacht haben Unsinn ist. Was spricht dagegen einfach eine Instanzvariable der Klasse zu benutzen in der sich der EventHandler befindet? Warum willst du die Daten durch den Event routen?

                Comment


                • #9
                  hallo,

                  während ich mein Programm schreibe, ist mir schon häufiger aufgefallen, das ich mich in einem ausgelösten Event befinde und dieses auf Variablen zugreifen müsste, die nicht als public deklariert sind.

                  bei normalen prozeduren bzw. funktionen ist das kein problem, da übergibt man die variablen als ref an die prozedur und danach kann man mit dem veränderten Wert weiterarbeiten. diese möglichkeit gibt es nun leider nicht bei den Events, da sie ja an die zwei werte (object und eventargs) gebunden sind.

                  deswegen meine frage wie ich variablen bei events mit übergeben kann.

                  ich hoffe du verstehst was ich meine.

                  danke für deine hilfe.

                  Comment


                  • #10
                    während ich mein Programm schreibe, ist mir schon häufiger aufgefallen, das ich mich in einem ausgelösten Event befinde und dieses auf Variablen zugreifen müsste, die nicht als public deklariert sind.
                    Kannst du mir ein Beispiel geben für etwas an das du nicht kommst? Ich sehe keinen Weg wie dir das überarbeiten des Event werfens da helfen soll. Wenn du aus dem EventHandler nicht an die Daten kommst wieso sollte dann das Control das den Event geworfen hat an diese Daten kommen. Das Control(hier ein Button) sollte die selben Probleme haben.

                    Comment


                    • #11
                      hier ein beispiel für meine situation. es handelt sich nicht um ein button.click event, aber das habe ich auch nur als einfaches beispiel genommen.

                      in meinem programm benutze ich einen TreeView.

                      ich habe dann z. B. folgende Prozedur.


                      public void test()
                      {

                      int x_wert = 10;
                      int y_wert = 20;


                      ...

                      // im Laufe der Prozedur greife ich auf meinen TreeView zu:

                      ...

                      treeView1.SelectedNode = my_node;

                      //sobald ich einen Knoten selektiere, wird das Event treeView1_AfterSelect aufgerufen mit folgendem Aufbau:

                      private void treeView1_AfterSelect(object sender, TreeViewEventArgs e)

                      //in diesem Event soll auf die Variablen x_wert und y_wert zugegriffen werden //und dessen Wert abgeändert werden, allerdings sind diese nicht erreichbar.

                      //sobald das Events fertig ist, komme ich zurück zur Prozedur und die beiden //jetzt veränderten Werte x_wert und y_wert werden ausgelesen, um //bestimmte Operationen durchzufüren.

                      //deswegen würde ich gerne die Variablen x_wert und y_wert als ref an das //Event übergeben, aber das geht ja leider nicht.

                      }



                      ich hoffe du hast verstanden, was ich erreichen will.

                      danke für deine hilfe.

                      Comment


                      • #12
                        Dann mach doch x und y einfach als Member der Klasse/der Form und dann kannst Du von überall auf x und y zugreifen, nicht nur innerhalb dieser einen Funktionen.

                        Comment


                        • #13
                          Das sinnvollste wäre wohl aus x_wert und y_Wert eine private Instanzvariablen der Klasse in der sich deine Test Methode und der treeView1_AfterSelect EventHandler befinden zu machen dann kannst du aus beiden darauf zugreifen.

                          Dem TreeView das wissen zu geben was x_wert und y_wert sind (damit er die im Event mitgeben kann) macht wenig Sinn denn der AfterSelect Event wird ja bei jedem selektieren ausgeführt und nicht nur wegen deinem SelectedNode Zuweisung in deiner Methode. Woher x und y dann nehmen wenn der Event nicht aus deiner Methode aus initiiert wird? Woher wissen das man dem TreeView ein x und y Wert unterjubeln muss weil er gleich einen AfterSelect Wert werfen wird?

                          Comment


                          • #14
                            hallo,

                            danke für eure antworten. meinst du mit private instanzvariable der klasse folgendes?

                            Code:
                             public partial class Form1 : Form         //Klasse mit test-methode und tree-event
                                {
                                    public int y_wert=10;
                                    public int x_wert=10;
                            
                                    ...
                            
                                 }

                            so habe ich das nämlich bisher auch gemacht. das fand ich nur nicht so schön bzw. unsauber, da ich mehrere variablen habe, die durch events geändert werden und ich dann schon recht viele instanzvariablen der klasse habe.

                            deswegen hatte ich gehofft, dass ich variablen einem event übergeben kann.

                            vielen dank für die mühe.

                            mfg

                            Comment

                            Working...
                            X