Heim >Backend-Entwicklung >C++ >Können Ereignishandler programmgesteuert zwischen Steuerelementen in Windows Forms übertragen werden?

Können Ereignishandler programmgesteuert zwischen Steuerelementen in Windows Forms übertragen werden?

Linda Hamilton
Linda HamiltonOriginal
2025-01-04 19:04:40317Durchsuche

Can Event Handlers Be Programmatically Transferred Between Controls in Windows Forms?

Können Event-Handler zwischen Steuerelementen übertragen werden?

Es besteht die Möglichkeit, einen Event-Handler von einem Steuerelement zu „stehlen“ und einem anderen zuzuweisen ist seit Jahren ein Diskussionsthema in der Programmiergemeinschaft. Obwohl die in der Frage vorgeschlagene Syntax ungültig ist, ist es technisch tatsächlich möglich, Ereignishandler zur Laufzeit zwischen Steuerelementen zu übertragen.

The Reflection Route

Aufgrund der privaten und Aufgrund der internen Natur bestimmter Mitglieder innerhalb des Windows Forms-Frameworks ist eine Reflexion erforderlich, um dieses Kunststück zu erreichen. Durch die Nutzung von Reflection können Sie auf private Felder und Eigenschaften zugreifen, auf die sonst nicht zugegriffen werden könnte.

Im bereitgestellten Codebeispiel wird eine Reihe von Reflection-Operationen ausgeführt:

  • Das geheime Klickereignis Der Schlüssel wird aus der Control-Klasse abgerufen.
  • Das Klickereignis wird aus der Component-Klasse abgerufen.
  • Der Ereignishandler für button1 wird entfernt. und dann zu Button2 hinzugefügt.

Dadurch wird der Event-Handler effektiv von Button1 auf Button2 übertragen.

Implementierungsbeispiel

Hier ist eine überarbeitete Version des im bereitgestellten Codes Frage:

using System;
using System.ComponentModel;
using System.Windows.Forms;
using System.Reflection;

namespace EventHandlerTransfer {
  public partial class Form1 : Form {
    public Form1() {
      InitializeComponent();
      button1.Click += new EventHandler(button1_Click);
      TransferEventHandler(button1, button2);
    }

    private void TransferEventHandler(Control source, Control destination) {
      // Get secret click event key
      FieldInfo eventClick = typeof(Control).GetField("EventClick", BindingFlags.NonPublic | BindingFlags.Static);
      object secret = eventClick.GetValue(null);
      // Retrieve the click event
      PropertyInfo eventsProp = typeof(Component).GetProperty("Events", BindingFlags.NonPublic | BindingFlags.Instance);
      EventHandlerList eventsSource = (EventHandlerList)eventsProp.GetValue(source, null);
      EventHandlerList eventsDestination = (EventHandlerList)eventsProp.GetValue(destination, null);
      Delegate click = eventsSource[secret];
      // Remove it from source, add it to destination
      eventsSource.RemoveHandler(secret, click);
      eventsDestination.AddHandler(secret, click);
    }

    void button1_Click(object sender, EventArgs e) {
      MessageBox.Show("Yada");
    }
  }
}

Fazit

Obwohl die Möglichkeit, Event-Handler auf diese Weise zu übertragen, wie eine leistungsstarke Funktion erscheinen mag, sollte sie mit Vorsicht verwendet werden. Diese Technik basiert stark auf Reflexion, was Auswirkungen auf die Leistung haben und auch potenzielle Fehler verursachen kann. Darüber hinaus wird das Ändern privater Mitglieder des Windows Forms-Frameworks nicht empfohlen, da dies Ihre Anwendung beschädigen kann, wenn in zukünftigen Versionen des Frameworks Änderungen vorgenommen werden.

Das obige ist der detaillierte Inhalt vonKönnen Ereignishandler programmgesteuert zwischen Steuerelementen in Windows Forms übertragen werden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn