2008-10-29 4 views
9

Ich habe ein .NET UserControl (FFX 3.5). Dieses Steuerelement enthält mehrere untergeordnete Steuerelemente - ein Panel, ein paar Labels, ein paar TextBoxes und noch ein benutzerdefiniertes Steuerelement. Ich möchte mit einem Rechtsklick irgendwo auf dem Basis-Steuerelement umgehen - also mit der rechten Maustaste auf ein untergeordnetes Steuerelement (oder Kind eines Kindes im Fall des Bereichs). Ich würde es gerne so machen, dass es gewartet werden kann, wenn jemand Änderungen am Control vornimmt, ohne dass er beispielsweise Handler für neue Controls einbinden muss.Umgang mit einem Klick für alle Steuerelemente in einem Formular

Zuerst versuchte ich, den WndProc zu überschreiben, aber wie ich vermutete, erhalte ich nur Nachrichten für Klicks auf das Formular direkt, nicht irgendwelche seiner Kinder. Als halb-Hack, habe ich folgendes nach InitializeComponent:

foreach (Control c in this.Controls) 
    { 
    c.MouseClick += new MouseEventHandler(
     delegate(object sender, MouseEventArgs e) 
     { 
     // handle the click here 
     }); 
    } 

Diese nun Klicks für Kontrollen erhält, die das Ereignis unterstützen, sondern Labels zum Beispiel immer noch nichts zu tun bekommen. Gibt es einen einfachen Weg, dies zu tun, den ich übersehe?

Antwort

15

Wenn die Etiketten in einem Substeuerelement sind dann würden Sie diese rekursiv zu tun haben:

void initControlsRecursive(ControlCollection coll) 
{ 
    foreach (Control c in coll) 
    { 
     c.MouseClick += (sender, e) => {/* handle the click here */}); 
     initControlsRecursive(c.Controls); 
    } 
} 

/* ... */ 
initControlsRecursive(Form.Controls); 
+0

So verdammt offensichtlich, dass ich den Wald für die Bäume nicht sehen konnte. Vielen Dank. – ctacke

0

Um eine Mouseclick Ereignis für einen Rechtsklick auf alle Steuerelemente in einem benutzerdefinierten Usercontrol Griff:

public class MyClass : UserControl 
{ 
    public MyClass() 
    { 
     InitializeComponent(); 

     MouseClick += ControlOnMouseClick; 
     if (HasChildren) 
      AddOnMouseClickHandlerRecursive(Controls); 
    } 

    private void AddOnMouseClickHandlerRecursive(IEnumerable controls) 
    { 
     foreach (Control control in controls) 
     { 
      control.MouseClick += ControlOnMouseClick; 

      if (control.HasChildren) 
       AddOnMouseClickHandlerRecursive(control.Controls); 
     } 
    } 

    private void ControlOnMouseClick(object sender, MouseEventArgs args) 
    { 
     if (args.Button != MouseButtons.Right) 
      return; 

     var contextMenu = new ContextMenu(new[] { new MenuItem("Copy", OnCopyClick) }); 
     contextMenu.Show((Control)sender, new Point(args.X, args.Y)); 
    } 

    private void OnCopyClick(object sender, EventArgs eventArgs) 
    { 
     MessageBox.Show("Copy menu item was clicked."); 
    } 
}