2016-06-24 5 views
0

Pseudo-Code, wie ich es erwartet, dass funktioniert, aber ich bin mir nicht sicher, was. Net-Methoden, die ich aufrufen muss, um dies zu erreichen.Schleife durch alle Steuerelemente auf Formular und wenn Ereignis existiert auf Steuerelement hinzufügen Handler zu steuern

Dim specifiedEvent = "MouseDown" 
    Dim handler = handler 
    For Each control As Control in form.controls 
     If control has specifiedEvent Then 

     control.specifiedEvent addhandler handler 

     End If 
    Next 

C# verbunden ist, weil es leicht

+1

Obwohl Sie dies mithilfe der Reflektion tun könnten, um die angegebenen Ereignisse zu finden, besteht das Problem hier darin, den Handler-Code anzugeben. Wie würden Sie erwarten, dass der HF aussieht?Verschiedene Ereignisse können unterschiedliche Argumente haben. –

+0

@MatthewWatson in .net Ich glaube, Handler müssen eine bestimmte Definition haben, je nachdem, welches Ereignis sie behandeln. also würde ich erwarten, dass es in diesem Fall die passende Definition für mousedown hat, da ich nach mouse down suche. – codemonkeyliketab

+0

Ist das nur für 'MouseDown'? Jede 'Steuerung' hat ein 'MouseDown'-Ereignis .... das muss nicht überprüft werden. –

Antwort

3

Ich bin nicht so gut in VB, also hier mein C# try Vb umgewandelt werden:

foreach(Control c in form.Controls) 
    c.GetType().GetEvent(specifiedEvent)?.AddMethod?.Invoke(c, new object[] {handler}); 

Type.GetEvent() gibt einen EventInfo für die Ereignis mit dem angegebenen Namen oder null, wenn kein solches Ereignis existiert. Die AddMethod-Eigenschaft dieses EventInfo ist die MethodInfo der Add-Methode dieses Ereignisses.

Dies ist C# 6. Sie müssen also möglicherweise zusätzliche null Prüfungen hinzufügen (wo ich den null-Propagation/null bedingten Operator ?), um zu überprüfen, ob das Ereignis wirklich existiert.


Wenn Ihre Frage nur über das MouseDown Ereignis ist, dann ist es ein wenig seltsam, weil die Control Klasse selbst erklärt das MouseDown Ereignis. Also jede Klasse geerbt von Control hat dieses Ereignis (außer Ihr Umgang mit Klassen, die dieses Ereignis absichtlich verstecken). So fügen Sie könnte einfach das Ereignis an alle Control s:

foreach(Control c in form.Controls) 
    c.MouseDown += handler; 
+1

Bin ich paranoid oder jagt mich jemand? Dies ist das dritte Mal, dass ich heute einen Downvote ohne Erklärung über eine ansonsten gut erhaltene Antwort bekomme ... –

+0

Ärgerlich, wenn das passiert. Die Leute sollten zumindest eine Erklärung geben (es sei denn, es ist offensichtlich, was das Problem ist - was hier nicht der Fall ist). –

+0

Die Antwort, die ich geben wollte, war die gleiche wie Ihr Kommentar zu jedem Steuerelement mit einem 'MouseDown'-Ereignis. Ich bin nicht der Downvoter, aber vielleicht ist das die bessere Antwort? Ich wollte antworten, aber es hat keinen Sinn, Ihren Kommentar zu kopieren. –

1

Da die Menschen haben bereits darauf hingewiesen, wenn Sie auf der Suche nach „MouseDown-“, dann gibt es keine Notwendigkeit zu überprüfen.

Wenn Sie jedoch einen Ansatz benötigen, der Reflektion verwendet, die einen Handler an ein Ereignis anfügt, geben Sie den Namen des Handlers und den Namen des Ereignisses als Strings an, dann können Sie das folgendermaßen tun.

Dieser Code legt den Event-Handler mit einem Ereignis in einem Behälter in jedes Kontroll verschachtelt, die den angegebenen Namen übereinstimmt:

public void HookUp(Control container, string handlerName, string eventName) 
{ 
    MethodInfo eventHandler = this.GetType().GetMethod(handlerName, BindingFlags.NonPublic | BindingFlags.Instance); 

    foreach (var control in container.Controls.Cast<Control>()) 
    { 
     var ev = control.GetType().GetEvent(eventName); 

     if (ev == null) 
      continue; 

     var d = Delegate.CreateDelegate(ev.EventHandlerType, this, eventHandler); 
     ev.AddEventHandler(control, d); 
    } 
} 

Als Beispiel der Maus nach unten Handler würde wie folgt aussehen:

private void mouseEventHandler(object sender, MouseEventArgs e) 
{ 
    Debug.WriteLine(e.Button); 
} 

Und Sie es von einem geeigneten Ort (wie ein Formularkonstruktor) nennen könnte wie folgt:

public Form1() 
{ 
    InitializeComponent(); 
    HookUp(this, "mouseEventHandler", "MouseDown"); 
} 
die

folgende Anmerkung:

  1. Dies scheint eine seltsame Sache tun zu wollen. Ich habe das Gefühl, dass es eine viel bessere Möglichkeit geben wird, sich Ihrem Problem zu nähern (es klingt wie ein X-Y-Problem).
  2. Dies wird NICHT von der Veranstaltung abbestellt. Sie müssten dies in der dispose-Methode des Formulars tun, indem Sie eine ähnliche Art von Code verwenden und stattdessen nur .RemoveEventHandler() aufrufen.
Verwandte Themen