Announcement

Collapse
No announcement yet.

Eventhandler eines Controls einem anderen Control zuweisen

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

  • Eventhandler eines Controls einem anderen Control zuweisen

    Hallo,
    ich habe folgendes kleines Problem: Ich möchte aus einem contextMenu ein neues contextMenu in einem anderen Form als Kopie erstellen bzw. in ein bestehendes Menu einflechten. Nun kann man das Menu samt Items ja leicht als Parameter übergeben und daraus auch wieder neue Items basteln. Nur kann man so einfach nicht die den Items zugeordneten Events den neuen Items zuweisen. Auch die Eventhandler aus dem ersten Form sind ja dem zweiten Form unbekannt. In Delphi konnte man das einfach so machen:
    Button1.OnClick := Button2.OnClick;
    Gibt es in C# eine Möglichkeit, Events (z.B. Click) des einen Controls einem anderen zuzuordnen? Danke für Tipps.
    Hermann

  • #2
    Hallo,

    In Delphi konnte man das einfach so machen: Button1.OnClick := Button2.OnClick;
    da Delphi und C# mit Anders Heijlsberg den gleichen "Vater" haben, geht das Gleiche selbstverständlich auch in C#. Nur die Syntax unterscheidet sich, weil ja in C# sogar Multicast Delegates zulässig sind. Eine Ereignisbehandlungsmethode kann somit über += aktiviert und über -= wieder entfernt werden. Damit der "richtige" Multicast Delegate von der Instanz enfernt wird, muss über new die identische Signatur übergeben werden wie beim Aktivieren (aus diesem Grund sieht der Zweig zum Entfernen für einen Delphianer etwas merkwürdig aus).

    <div style="font-family: Consolas; font-size: 10pt; color: black; background: white;"><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: blue;">private</span> <span style="color: blue;">void</span> button1_Click(<span style="color: blue;">object</span> sender, <span style="color: #2b91af;">EventArgs</span> e)</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: #2b91af;">MessageBox</span>.Show(<span style="color: #a31515;">"Click-Handler f&#252;r Button 1"</span>);</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }</p><p style="margin: 0px;">&nbsp;</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: blue;">private</span> <span style="color: blue;">void</span> checkBox1_CheckedChanged(<span style="color: blue;">object</span> sender, <span style="color: #2b91af;">EventArgs</span> e)</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: blue;">if</span> (checkBox1.Checked)</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: green;">// Ereignisbehandlung aktivieren</span></p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; button2.Click +=<span style="color: blue;">new</span> <span style="color: #2b91af;">EventHandler</span>(button1_Click);</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: blue;">else</span></p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: green;">// Ereignisbehandlung deaktivieren</span></p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; button2.Click -= <span style="color: blue;">new</span> <span style="color: #2b91af;">EventHandler</span>(button1_Click);</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }</p></div>

    Comment


    • #3
      Hallo und vielen Dank für die rasche Antwort,
      ich meine das eigentlich so, daß der Name der Methode, bzw. Eventhandler (hier: button1_Click) button2 eigentlich gar nicht bekannt ist. button2 soll nur davon ausgehen, daß button1 für das Click-Event eine Eventhandler-Kette besitzt und soll genau diese von button1 übernehmen, ohne die einzelnen Eventhandler nennen zu müssen.
      Vielleicht hilft auch die Beschreibung des Problems:
      Ein MDI-Child enthält ein contextMenu mit verschiedenen Items und entsprechenden Click-Handlern. Das MDI-Parent Form hat eine Toolbar mit z.B. SubItems (in dem Falle ist es eine XtraBar von Develeoper Express), die auch Click -Events besitzen. Nun möchte ich beim Aktivieren des MDI-Childs die Items des MDI-Child contextMenu in die SubItems des MDI-Parents aufnehmen. Die SubItems der XtraBar werden vor dieser Aktion gelöscht und neu aufgebaut.

      public void RegisterChildForm(HS.XTraGrid.HS_XtraGrid aHS_XtraGrid,
      string aDataTableName,
      System.EventHandler RecordInsertMethod,
      System.EventHandler RecordEditMethod,
      System.EventHandler RecordDeleteMethod,
      System.EventHandler RecordsPasteMethod,
      System.EventHandler RefreshMethod,
      ContextMenuStrip contextMenuOptions)
      {
      ....
      this.btnToolBarOptionsSub.ItemLinks.Clear(); // subItems im MDI-Parent löschen
      for(int i=0; i<contextMenuOptions.Items.Count; i++)
      {
      DevExpress.XtraBars.BarButtonItem item = new DevExpress.XtraBars.BarButtonItem(this.barManager1 , contextMenuOptions.Items[i].Text);
      ... HIER SOLL DAS EVENT von contextMenuOptions.Items[i] an item ZUGEWIESEN WERDEN, damit dieses genauso reagiert wie contextMenuOptions.Items[i]
      }

      Vielen Dank für eine helfende Antwort

      Comment


      • #4
        Hallo,

        button2 soll nur davon ausgehen, daß button1 für das Click-Event eine Eventhandler-Kette besitzt und soll genau diese von button1 übernehmen, ohne die einzelnen Eventhandler nennen zu müssen.
        wenn es nur darum geht, die aktuell der anderen Button-Instanz zugeordneten Multicast Delegates aufzurufen, ist die Methode PerformClick der kürzeste Weg:

        <div style="font-family: Consolas; font-size: 10pt; color: black; background: white;"><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: blue;">private</span> <span style="color: blue;">void</span> button2_Click(<span style="color: blue;">object</span> sender, <span style="color: #2b91af;">EventArgs</span> e)</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; button1.PerformClick();</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }</p></div>

        Comment


        • #5
          Hallo,
          dieser Weg ist bekannt. Das Problem ist, daß es eine Methode button2_Click gar nicht gibt, sondern nur eine Methode button1_Click und button2 zur Laufzeit erst erzeugt wird:

          Hier nochmal ein Beispiel:

          for(int i=0; i<contextMenuOptions.Items.Count; i++) // für alle Items
          {
          // neuen Button erzeugen
          BarButtonItem newItem = new BarButtonItem(this.barManager1 , contextMenuOptions.Items[i].Text);
          // Damit wird erst einmal ein neues Menuitem in's Leben gerufen,
          // welches hier nicht mehr als eine Caption bekommt.

          // Jetzt soll das passieren, was in Delphi (1-7) so ausgesehen hätte:
          // newItem.OnClick := contextMenuOptions.Items[i].OnClick;
          // d.h. es muß gar nicht bekannt sein, wie der Eventhandler von
          // contextMenuOptions.Items[i] heißt, was im Falle dieser
          // Iteration auch gar nicht gehen würde, da es sich um
          // ein ItemArray handelt, dessen einzelne Eventhandler-Namen
          // gar nicht bekannt sind.
          // z.B.:

          newItem.Click += contextMenuOptions.Items[i].Click;
          // was natürlich nicht funktioniert.
          ...
          }
          Zuletzt editiert von Hermann Schmidt; 10.03.2007, 21:50.

          Comment


          • #6
            Hallo,

            anstelle von newItem.Click += contextMenuOptions.Items.Click würde ich dort den folgenden Aufruf unterbringen:

            <div style="font-family: Courier New; font-size: 10pt; color: black; background: white; border-top: windowtext 1pt solid; padding-top: 0pt; border-left: windowtext 1pt solid; padding-left: 0pt; border-right: windowtext 1pt solid; padding-right: 0pt; border-bottom: windowtext 1pt solid; padding-bottom: 0pt;"><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: blue;">private</span> <span style="color: blue;">void</span> contextMenuToolStripMenuItem_Click(<span style="color: blue;">object</span> sender, <span style="color: #2b91af;">EventArgs</span> e)</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: #2b91af;">MessageBox</span>.Show(<span style="color: #a31515;">"ContextMenu1"</span>);</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }</p><p style="margin: 0px;">&nbsp;</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: blue;">private</span> <span style="color: blue;">void</span> Form1_Load(<span style="color: blue;">object</span> sender, <span style="color: #2b91af;">EventArgs</span> e)</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; toolStripButton1.Click += <span style="color: blue;">delegate</span>(<span style="color: blue;">object</span> x, <span style="color: #2b91af;">EventArgs</span> args)</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; contextMenuToolStripMenuItem.PerformClick();</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; };</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }</p></div>

            Als Rumpf-Ereignisbehandlungsmethode wird eine anonyme Methode aktiviert, die sofort die PerformClick-Methode des korrespondierenden Kontextmenü-Eintrags aufruft.

            Ein Beispiel für die dynamische Zuordnung könnte dann so aussehen:

            <div style="font-family: Courier New; font-size: 10pt; color: black; background: white; border-top: windowtext 1pt solid; padding-top: 0pt; border-left: windowtext 1pt solid; padding-left: 0pt; border-right: windowtext 1pt solid; padding-right: 0pt; border-bottom: windowtext 1pt solid; padding-bottom: 0pt;"><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: blue;">private</span> <span style="color: blue;">void</span> contextMenuToolStripMenuItem_Click(<span style="color: blue;">object</span> sender, <span style="color: #2b91af;">EventArgs</span> e)</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: #2b91af;">MessageBox</span>.Show(<span style="color: #a31515;">"ContextMenu1"</span>);</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }</p><p style="margin: 0px;">&nbsp;</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: blue;">private</span> <span style="color: blue;">void</span> contextMenu2ToolStripMenuItem_Click(<span style="color: blue;">object</span> sender, <span style="color: #2b91af;">EventArgs</span> e)</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: #2b91af;">MessageBox</span>.Show(<span style="color: #a31515;">"ContextMenu2"</span>);</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }</p><p style="margin: 0px;">&nbsp;</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: blue;">private</span> <span style="color: blue;">void</span> contextMenu3ToolStripMenuItem_Click(<span style="color: blue;">object</span> sender, <span style="color: #2b91af;">EventArgs</span> e)</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: #2b91af;">MessageBox</span>.Show(<span style="color: #a31515;">"ContextMenu3"</span>);</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }</p><p style="margin: 0px;">&nbsp;</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: blue;">private</span> <span style="color: blue;">void</span> Form1_Load(<span style="color: blue;">object</span> sender, <span style="color: #2b91af;">EventArgs</span> e)</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: green;">// Die Tag-Eigenschaft "koppelt" die korrespondierenden Einträge</span></p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; contextMenuToolStripMenuItem.Tag = 1;</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; contextMenu2ToolStripMenuItem.Tag = 2;</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; contextMenu3ToolStripMenuItem.Tag = 3;</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; toolStripButton1.Tag = 1;</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; toolStripButton2.Tag = 2;</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; toolStripButton3.Tag = 3;</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: green;">// Demo</span></p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: blue;">for</span> (<span style="color: blue;">int</span> i = 0; i &lt;= 2; i++)</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; toolStrip1.Items[i].Click += <span style="color: blue;">delegate</span>(<span style="color: blue;">object</span> x, <span style="color: #2b91af;">EventArgs</span> args)</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: blue;">foreach</span> (<span style="color: #2b91af;">ToolStripItem</span> aTSI <span style="color: blue;">in</span> contextMenuStrip1.Items)</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: blue;">if</span> ((<span style="color: blue;">int</span>)aTSI.Tag == (<span style="color: blue;">int</span>)(x <span style="color: blue;">as</span> <span style="color: #2b91af;">ToolStripButton</span>).Tag)</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; aTSI.PerformClick();</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; };</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }</p></div>

            Anstelle die Ereignisbehandlungsmethode statisch festzulegen, wird zur Laufzeit immer die Liste (Multicast Delegates) abgearbeitet, die zu diesem Zeitpunkt dem Click-Ereignis des Kontextmenüeintrags zugeordnet ist.
            Zuletzt editiert von Andreas Kosch; 12.03.2007, 08:55.

            Comment


            • #7
              Guten Morgen,
              das ist eine Lösung. Vielen Dank. Das Beispiel zeigt, daß die Lernkurve beim Umstieg von "älteren" Programmiersprachen (z.B. Delphi 1-7) auf eine .NET Sprache nicht immer nach unten zeigt. - Und, daß nicht alle alten Standardlösungen in der "neuen" Welt eleganter zu lösen sind, wenn man schon für eine (früher einmal) so recht triviale Aufgabe (wie z.B. Button1.OnClick := Button2.OnClick; ) den Rettungsanker "Tag" bemühen muß. Die Verwendung von Tag birgt immer die Gefahr, daß man bei späteren Anpassungen im Designer oder Quellcode vergißt, die entsprechende lfd. Nummer zu vergeben.
              Zuletzt editiert von Hermann Schmidt; 12.03.2007, 11:04.

              Comment


              • #8
                Originally posted by Hermann Schmidt View Post
                Guten Morgen,
                das ist eine Lösung. Vielen Dank. Das Beispiel zeigt, daß die Lernkurve beim Umstieg von "älteren" Programmiersprachen (z.B. Delphi 1-7) auf eine .NET Sprache nicht immer nach unten zeigt. - Und, daß nicht alle alten Standardlösungen in der "neuen" Welt eleganter zu lösen sind, wenn man schon für eine (früher einmal) so recht triviale Aufgabe (wie z.B. Button1.OnClick := Button2.OnClick; ) den Rettungsanker "Tag" bemühen muß. Die Verwendung von Tag birgt immer die Gefahr, daß man bei späteren Anpassungen im Designer oder Quellcode vergißt, die entsprechende lfd. Nummer zu vergeben.
                Wenn man einmal unterstellt, daß Menüitems mit identischem Text in der Praxis wenig Sinn machen, kann man statt der Tags auch die Eigenschaft Text verwenden und ist damit vom o.g. Pflegeaufwand befreit.


                Code:
                private void contextMenuToolStripMenuItem_Click(object sender, EventArgs e)
                {
                  MessageBox.Show("ContextMenu1");
                }
                private void contextMenu2ToolStripMenuItem_Click(object sender, EventArgs e)
                {
                  MessageBox.Show("ContextMenu2");
                }
                private void contextMenu3ToolStripMenuItem_Click(object sender, EventArgs e)
                {
                  MessageBox.Show("ContextMenu3");
                }
                
                private void btnMerge_Click(object sender, EventArgs e)
                {
                  contextMenuStrip2.Items.Clear();
                  for (int i = 0; i < contextMenuStrip1.Items.Count; i++)
                  {
                    ToolStripItem newItem = contextMenuStrip2.Items.Add(contextMenuStrip1.Items[i].Text);
                    newItem.Click += delegate(object x, EventArgs args)
                                     {
                                       foreach (ToolStripItem aTSI in contextMenuStrip1.Items)
                                       {
                                         if (aTSI.Text == (x as ToolStripItem).Text)
                                           aTSI.PerformClick();
                                       }
                                     };
                  }
                }
                Zuletzt editiert von Hermann Schmidt; 12.03.2007, 17:32.

                Comment


                • #9
                  Hallo Hermann Schmidt,


                  noch eine kleine Variante, diesmal jedoch unabhängig von Text oder Tag:

                  Code:
                          class ToolStripMenuItemEx : ToolStripMenuItem
                          {
                              public ToolStripItem Reference = null;
                          }
                  
                          private void Menü_kopieren_Click(object sender, EventArgs e)
                          {
                              ToolStripMenuItemEx NeuerMenüpunkt = null;
                              for (int i = 0; i < Quellmenü1ToolStripMenuItem.DropDownItems.Count; i++)
                              {
                                  NeuerMenüpunkt=new ToolStripMenuItemEx();
                                  NeuerMenüpunkt.Reference = Quellmenü1ToolStripMenuItem.DropDownItems[i];
                                  NeuerMenüpunkt.Text = NeuerMenüpunkt.Reference.Text;
                                  NeuerMenüpunkt.Click +=
                                      delegate(object asender, EventArgs eventargs)
                                      {
                                          (asender as ToolStripMenuItemEx).Reference.PerformClick();
                                      };
                                  
                                  ZielmenüToolStripMenuItem.DropDownItems.Add(NeuerMenüpunkt);
                              }    
                          }

                  Mit freudlichen Grüßen,


                  rednax

                  Comment

                  Working...
                  X