Frage

Ich habe Art gesichert mich in eine Ecke hier.

Ich habe eine Reihe von Benutzersteuerelementen, die von einem Elternteil erben, die ein paar Methoden und Ereignissen enthalten die Dinge zu vereinfachen, damit ich Linien und Linien von nahezu identischem Code nicht schreiben müssen. Wie du tust. Die Mutter enthält keine weiteren Kontrollen.

Was ich tun möchte, ist nur einen Event-Handler haben, in dem übergeordneten Benutzersteuerelement, das geht und tut Dinge, die nur die übergeordnete Steuerung tun kann (das heißt, bedingt ein Ereignis nennen, wie die in den übergeordneten definierten Ereignisse). Ich würde dann diese Event-Handler, um alle meine Eingabefelder in meinem Kind Kontrollen Haken, und die untergeordneten Steuerelemente die Aufgabe, den Eingang aussortieren würde das Parsen und sagen, die übergeordnete Steuerung, ob dieses Ereignis zu werfen. Schön und sauber, keine sich wiederholend, Copy-Paste-Code (die für mich immer führt zu einem Fehler).

Hier ist meine Frage. Visual Studio denkt, ich bin um die Hälfte zu klug zu sein, und warnt mich, dass „die Methode‚CheckReadiness‘[der Event-Handler in der übergeordneten] nicht die Methode für ein Ereignis sein kann, weil eine Klasse dieser Klasse ergibt sich aus bereits die Methode definiert.“ Ja, Visual Studio, das ist der Punkt . I wollen einen Ereignishandler zu haben, die nur Ereignisse von untergeordneten Klassen geworfen behandelt, und seine einzige Aufgabe ist es mir zu ermöglichen, die Kinder anzuschließen, ohne eine einzige Zeile Code zu schreiben. Ich weiß nicht, diese zusätzlichen Handler benötigen -. Alle Funktionen Ich brauche natürlich wie die Kinder die Benutzereingaben verarbeiten

genannt wird

Ich bin nicht sicher, warum Visual Studio darüber beschwert hat begonnen, jetzt (wie es lass es mich tun, bevor), und ich bin nicht sicher, wie es weg zu gehen. Vorzugsweise würde Ich mag es zu tun, ohne eine Methode zu definieren, die die gerade CheckReadiness aufruft. Was ist diese Warnung verursacht, was verursacht es jetzt kommen, wenn es nicht vor einer Stunde tut, und wie kann ich es weg, ohne in allen untergeordneten Klassen zu machen wenig Handler zurückgreifen?

War es hilfreich?

Lösung

Deklarieren Sie die übergeordnete Methode virtuell, außer Kraft setzen es in den Kinderklassen und rufen

base.checkReadyness(sender, e);

(oder derevation davon) aus der untergeordneten Klasse. Dies ermöglicht eine zukünftige Gestaltung Evolution sagen, wenn Sie einige spezifische Fehlerprüfcode tun wollen, bevor die Mutter Event-Handler aufrufen. Sie werden vielleicht nicht für jede Steuerung wie diese Millionen von Event-Handler schreiben müssen, müssen Sie nur ein schreiben konnte, Haken alle Steuerelemente zu diesem Event-Handler, die wiederum die Event-Handler-Mutter aufruft.

Eine Sache, die ich bemerkt habe ist, dass, wenn alle dieser Code innerhalb einer DLL platziert wird, dann könnten Sie eine Performance-Einbußen erleben versuchen, einen Event-Handler aufrufen aus einer DLL.

Andere Tipps

ich auf dieses eine gerade gekommen sind, als auch, Ich bin damit einverstanden, dass es fühlt sich an wie du alles richtig machst. das Verfahren virtuellen Deklarieren ist ein Work-around bestenfalls keine Lösung.

Was getan wird, gilt - eine Kontrolle, die nur in der abgeleiteten Klasse existiert, und die abgeleitete Klasse eine Ereignisbehandlungsroutine zu einem der, dass die Kontrolle der Ereignisse anzubringen. Die Tatsache, dass die Methode, die das Ereignis ist der Umgang mit in der Basisklasse definiert ist, ist weder hier noch dort, ist es an der Stelle der Bindung an der Veranstaltung. Die Veranstaltung ist nicht dumm, so zu zweimal oder so angebracht ist, es ist einfach eine Frage, wo die Methode, die das Ereignis behandelt wird, definiert ist.

Die meisten auf jeden Fall ist es nicht eine virtuelle Methode - ich weiß nicht die Methode will overridable von einer abgeleiteten Klasse sein. Sehr frustrierend, und meiner Meinung nach ist ein Fehler in dev-Studio.

Auch ich habe dieses Problem erfahren, weil in früheren Versionen von VS, Sie „erben“ die Event-Handler könnten. So ist die Lösung, die ich, ohne dass gefunden Methoden außer Kraft zu setzen ist einfach die Event-Handler irgendwo in der Initialisierungsphase des Formulars zuzuordnen. In meinem Fall, in dem Konstruktor getan (ich bin sicher, dass OnLoad () würde auch funktionieren):

    public MyForm()
    {
        InitializeComponent();
        btnOK.Click += Ok_Click;
    }

... wo der Ok_Click Handler befindet sich in der Grundform. Stoff zum Nachdenken.

Ich habe laufen gerade in das genaue Problem Merus ersten und aufgewachsen, wie andere, die Antworten geschrieben, ich bin nicht klar, warum VS (ich jetzt mit Visual C # 2010 Express) Objekte, die Event-Handler mit definierten in der Basisklasse. Der Grund, warum ich eine Antwort bin Entsendung ist, dass, indem die Basisklasse Code eines geschütztes Verfahren, um das Problem in dem Prozess der Einführung, dass die abgeleiteten Klassen einfach in ihrem (im Wesentlichen leer) aufrufen Event-Handler, ich ein Refactoring Umbenennungs der Basis tat Klassenmethode und bemerkte, dass die VS-Designer beschweren gestoppt. Das heißt, es umbenannt die Event-Handler-Registrierung (so ist es nicht mehr folgte die Konvention des VS-Designer von Event-Handler mit ControlName_EventName Benennung), und das schien ihn zu befriedigen. Als ich dann versucht, die (jetzt umbenannt) Basisereignishandler gegen abgeleiteten Klasse steuert zu registrieren, indem den Namen in dem entsprechenden VS-Ereignisse eintritt, erzeugte der Entwickler einen neuen Ereignis-Handler in der abgeleiteten Klasse, die ich dann gelöscht, die abgeleitete Klasse Steuer verlassen registriert auf die Basisklasse (event handler) Methode. Net, wie man erwarten würde, findet C #, was wir echt tun wollen. Es ist nur die VS-Designer, die es nicht mögen, wenn Sie den Event-Handler-Namenskonvention des Designers folgen. Ich sehe nicht die Notwendigkeit für den Designer, so zu arbeiten. Anywho, trägt Zeit auf.

Wenn Ihre Veranstaltung bereits in der übergeordneten Klasse definiert ist, brauchen Sie es nicht verkabeln wieder in Ihrem Kind Klasse. Das wird das Ereignis verursacht zweimal zu schießen.

Sie überprüfen, ob dies ist, was geschieht. HTH:)

Dieser Artikel auf MSDN sollte ein guter Ausgangspunkt sein > Übergeordnete Event-Handler mit Visual Basic .NET . Werfen Sie einen Blick auf die Wie die Griffe Klausel kann der Klasse verursachen Probleme bei der Derived Abschnitt.

Warum die Methode als virtuelle in der übergeordneten Klasse nicht erklären und dann können Sie es in den abgeleiteten Klassen überschrieben werden, um zusätzliche Funktionen hinzufügen?

Vergessen Sie, dass es sich um einen Event-Handler ist und nur das tun, überschreibt die richtige reguläre Methode in der Kinderklasse.

Hier ist, was ich getan habe in mehreren ähnlich aussehenden Formen genannt Basis Methoden zu bekommen, jeder von ihnen ein paar zusätzliche Funktionen zu den allgemeinen mit:

        protected override void OnLoad(EventArgs e)
    {
        try
        {
            this.SuspendLayout();
            base.OnLoad(e);

            foreach (Control ctrl in Controls)
            {
                Button btn = ctrl as Button;
                if (btn == null) continue;

                if (string.Equals(btn.Name, "btnAdd", StringComparison.Ordinal))
                    btn.Click += new EventHandler(btnAdd_Click);
                else if (string.Equals(btn.Name, "btnEdit", StringComparison.Ordinal))
                    btn.Click += new EventHandler(btnEdit_Click);
                else if (string.Equals(btn.Name, "btnDelete", StringComparison.Ordinal))
                    btn.Click += new EventHandler(btnDelete_Click);
                else if (string.Equals(btn.Name, "btnPrint", StringComparison.Ordinal))
                    btn.Click += new EventHandler(btnPrint_Click);
                else if (string.Equals(btn.Name, "btnExport", StringComparison.Ordinal))
                    btn.Click += new EventHandler(btnExport_Click);
            }

Die Chance einer Unterlassung der Verwendung des richtigen feste Taste Namen sieht genauso aus mir als Chance, nicht manuell den geerbte Handler Verdrahtung.

Beachten Sie, dass Sie für this.DesignMode testen müssen, so dass Sie den Code in VS Designer überspringen überhaupt, aber es funktioniert, ohne die Kontrolle für mich auch in Ordnung.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top