Announcement

Collapse
No announcement yet.

Button + EventHandler automatisch erstellen?

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

  • Button + EventHandler automatisch erstellen?

    Hallo alle zusammen..!

    Ich möchte auf einer Oberfläche Buttons darstellen, die automatisch erstellt werden sollen.

    Das automatische Erstellen von Buttons ist kein Problem, nur stellt sich die Frage, wie ich jedem Button einen eigenen EventHandler zuweisen kann, da jeder Button etwas anderes ausführen soll? ;-)

    Vielen Dank für eure Hilfe, b8x!

    Noch einen guten Rutsch ins neue Jahr..!

  • #2
    Hallo,

    die Stichwörter heißt Delegate und vor allem Anonyme Methoden. Wenn du das letztere für die SDK-Doku/MSDN/Hilfe-Index benutzt, kommt gleich als erstes ein passendes Beispiel:
    [highlight=c#]// Create a handler for a click event
    button1.Click += delegate(System.Object o, System.EventArgs e)
    { System.Windows.Forms.MessageBox.Show("Click!"); };[/highlight]
    Gruß und guten Rutsch! Jürgen
    Zuletzt editiert von fanderlf; 04.01.2010, 12:41. Reason: Code highlighting hinzugefügt

    Comment


    • #3
      ganz einfach gehts wenn du im visual studio das "button1.Click += " hinschreibst und dann 2 mal die (oder warens 3 mal) die Tab Taste drückst. Dann wird der Quelltext automatisch von visual studio erzeugt.

      Comment


      • #4
        Originally posted by Jürgen Thomas View Post
        Hallo,

        die Stichwörter heißt Delegate und vor allem Anonyme Methoden. Wenn du das letztere für die SDK-Doku/MSDN/Hilfe-Index benutzt, kommt gleich als erstes ein passendes Beispiel:
        Code:
        // Create a handler for a click event
        button1.Click += delegate(System.Object o, System.EventArgs e)
                           { System.Windows.Forms.MessageBox.Show("Click!"); };
        Gruß und guten Rutsch! Jürgen
        vielen Dank für deine Hilfe..!
        Nur weiß ich nicht, wie ich eine Reihe von Buttons erstelle, die jeweils etwas anderes ausführen sollen, sprich dass jeder Button ein anderen Namen hat? Wie kann ich dies erreichen?
        Gruß, b8x! Hoffe, ihr seid gut ins neue Jahr gerutscht

        Comment


        • #5
          Diese Fragen verstehe ich nicht:
          Nur weiß ich nicht, wie ich eine Reihe von Buttons erstelle, die jeweils etwas anderes ausführen sollen,
          Die unterschiedlichen Aufgaben musst du doch sowieso in deinem Programm berücksichtigen. Wenn du den neuen Button für Aufgabe 1 behandelst, erzeugst du einen neuen Button und packst in den EventHandler den Ablauf für Aufgabe 1 usw. Also kommt der Code, den ich zitiert hatte, etwa 23-mal vor.

          sprich dass jeder Button ein anderen Namen hat?
          Was hat der Name eines Buttons mit dem Click-EventHandler zu tun? Nichts. Was hat der Name eines Controls mit dem Namen einer Variablen zu tun? Fast nichts. Du kannst (wieder in dem zitierten Code) die lokale Variable button1 benutzen und dem Button trotzdem den Namen "ButtonClose" geben; der EventHandler kann trotzdem ein neues Formular öffnen. Namen sind wie Schall und Rauch und haben keine weitere Bedeutung.

          Wie kann ich dies erreichen?
          Innerhalb der Routine, die die Buttons und EventHandler erzeugt, kann z.B. für eine Schleife eine einheitliche Variable newButton verwendet werden. Wenn du von anderer Stelle aus wieder auf einen bestimmten Button zugreifen willst, dann benutze Button.Name und suche danach z.B. mit Controls.Find("dieser Buttonname").

          Vielleicht hilft dir auch [FAQ] Variablennamen zur Laufzeit zusammensetzen.

          Frohes Neues Jahr! Jürgen

          Comment


          • #6
            Er erstellt die Buttons dynamisch (denke ich)
            Suchwörter "das Erstellen von Plug-Ins in .NET"
            und
            ".NET Plug-In dynamisch laden"

            Jedes Plug-In ist eine DLL-Bibliothek, die dürch eine Button dargestellt werden kann.
            Deine Anwendung liest aus einem Verzeichnis (bsp "c:\Programme\DeineAnwenduing\Buttons") alle dort existierende DLLs und ladet sie dynamisch.
            Dann bekommst du in deinem GUI die Buttons, zu den eine DLL existiert.

            Die verschiedene Funktionalitäten Sind dann in entsprechender DLL realisiert.
            Bitte vergessen Sie nicht die Antwort zu bewerten. Danke.:-)

            Comment


            • #7
              Hmmm, programmiere nicht in NET, aber wenn ich das verfolge, dachte ich es geht so wie in anderen Sprachen

              Button mybutton=new Button();
              mybutton. -> setze erforderliche Parameter wie Position. Parent usw.
              mybutton.Click += Neuen Handler hinzufügen

              Jedes Plug-In ist eine DLL-Bibliothek, die dürch eine Button dargestellt werden kann.
              Deine Anwendung liest aus einem Verzeichnis (bsp "c:\Programme\DeineAnwenduing\Buttons") alle dort existierende DLLs und ladet sie dynamisch.
              Dann bekommst du in deinem GUI die Buttons, zu den eine DLL existiert.
              Das ist aber kompliziert......
              Christian

              Comment


              • #8
                Vielen Dank für eure Hilfe..! Jetzt habe ich es verstanden ;-)

                Comment


                • #9
                  Originally posted by Christian Marquardt View Post
                  Das ist aber kompliziert......
                  Wie so ? Ist es kompliziert ein PlugIn Template zu nehmen und anzupasen ?
                  Das ist leicht erweitbare und ich hoffe sehr .NET-Typische Lösung :-)

                  In deinem Fall muss man, bei neuen Buttons, immer Quellcode anpassen.
                  Bitte vergessen Sie nicht die Antwort zu bewerten. Danke.:-)

                  Comment


                  • #10
                    Ich denke schon dass er die Buttons dynamisch laden wollte. Allerdings die standard .NET buttons. Kein Mensch würde für jedes Control was er irgendwo dynamisch einbindet gleich in Plug-In definieren

                    Wohl eher sowas wie Christian es oben demonstriert hat.

                    Button mybutton=new Button();
                    mybutton. -> setze erforderliche Parameter wie Position. Parent usw.
                    mybutton.Click += Neuen Handler hinzufügen

                    Comment


                    • #11
                      Noch so eine Frage ;-)

                      Hallo alle zusammen..!
                      Nochmals danke für eure Hilfe, es funktioniert
                      Ich will ja zum Beispiel eine Reihe von Buttons erstellen, was ja funktioniert.
                      Nur will ich jetzt diese Buttons (Button btn) wieder löschen, aber wie?
                      Ich hätte es jetzt zum Beispiel so gemacht:
                      [highlight=c#]
                      public Button btn;
                      private void Form1_Load(object sender, EventArgs e)
                      {
                      for (int i = 50; i < 200; i = i + 60)
                      {
                      btn = new Button();
                      btn.Location = new Point(50, i);
                      btn.Width = 40;
                      btn.Height = 40;
                      Controls.Add(btn);
                      }
                      }
                      private void button1_Click_1(object sender, EventArgs e)
                      {
                      Controls.Remove(btn);
                      }
                      [/highlight]

                      Nur löscht dies immer nur den letzten Button, was eigendlich logisch ist. Aber wie kann ich jetzt alle Buttons btn löschen?

                      Danke für eure Hilfe, b8x!
                      Zuletzt editiert von fanderlf; 04.01.2010, 12:42. Reason: Codehighlighting hinzugefügt

                      Comment


                      • #12
                        In dem dur dir btn in einer Liste oder Array "merkst" und beim löschen diese Liste durchläufst
                        Christian

                        Comment


                        • #13
                          Alternativ geht es direkt in einer Schleife über Controls, wenn du einem Button "ansehen" kannst, ob er zu den "automatisch erstellten" Buttons gehört oder nicht:
                          [highlight=c#]for ( int x = Controls.Count - 1; x >= 0; x-- ) {
                          Button btn = Controls[x] as Button;
                          if ( btn != null && btn.Name.StartsWith("NewButton") {
                          Controls.Remove(btn);
                          }
                          }[/highlight]
                          Wenn die Controls-Liste nur diese Buttons enthält, geht natürlich auch Controls.Clear.

                          Welche Variante besser ist, hängt vor allem davon ab, was du sonst noch mit diesen Buttons anstellen willst: ob nämlich eine zusätzliche List<Button> (bitte kein Array) Vorteile bringt gegenüber der sowieso vorhandenen Controls-Liste.

                          Gruß Jürgen

                          PS. Nur der Vollständigkeit halber: for muss von hinten nach vorne laufen, und foreach geht nicht.
                          Zuletzt editiert von fanderlf; 04.01.2010, 12:42. Reason: Codehighlighting hinzugefügt

                          Comment


                          • #14
                            Originally posted by Jürgen Thomas View Post
                            [highlight=c#]for ( int x = Controls.Count - 1; x >= 0; x-- ) {
                            Button btn = Controls[x] as Button;
                            if ( btn != null && btn.Name.StartsWith("NewButton") {
                            Controls.Remove(btn);
                            }
                            }[/highlight]
                            Vorsicht das kann böse enden! Besser so:

                            [highlight=c#]foreach( Control c in Controls ) {
                            Button btn = c as Button;
                            if ( btn != null) {
                            if(btn.Name.StartsWith("NewButton") {
                            Controls.Remove(btn);
                            }
                            }
                            }[/highlight]

                            Comment


                            • #15
                              @fanderl : Lies Jürgens PS und probier deinen eigenen Vorschlag einmal aus. Du wirst merken das man über einen Enumerator (wird von foreach benutzt) die enumerierte Liste nicht ändern darf. Eine rückwärts laufende For-Schleife ist genau das richtige.

                              Comment

                              Working...
                              X