web-dev-qa-db-de.com

Diese Methode oder Operation ist nicht eingebaut

Es gibt zwei Formen. Form2 wird von Form1 abgeleitet.

Ich habe jedoch ein Problem mit Form2 im Designmodus, wie in der Abbildung unten gezeigt.

Wenn ich dies this._presenter.Retrive(); kommentiere, wird es gut funktionieren. Was ist los und wie wird das Problem gelöst?

UPD: Wenn ich den Wurf entferne, dann neue NotImplementedException (); und fügt beispielsweise MessageBox.Show ("Test") ein; jedes Mal, wenn ich Form2 öffne, wird die MessageBox so angezeigt, als würde ich die Anwendung ausführen.

 enter image description here

Form2

namespace InheritanceDemo
{
    public partial class Form2 : Form1
    {
        public Form2()
        {
            InitializeComponent();
        }
    }
}

Form 1

namespace InheritanceDemo
{
    public partial class Form1 : Form
    {
        protected IPresenter _presenter;

        public Form1()
        {
            InitializeComponent();
            _presenter = new Presenters();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            this._presenter.Retrive();
        }
    }

    public class Presenters : IPresenter
    {
        public void Retrive()
        {
            throw new NotImplementedException();
        }
    }

    public interface IPresenter
    {
        void Retrive();
    }
}
6
Mikhail Danshin

Die Hauptursache für Fehler ist, was Fᴀʀʜᴀɴ und Yuval gesagt haben:

throw new NotImplementedException();

Aber es gibt noch eine andere wichtige Sache, auf die Sie achten sollten.

OP: Wenn ich den Wurf entferne, dann neue NotImplementedException (); und wird Fügen Sie beispielsweise MessageBox.Show ("Test"); jedes Mal ein, wenn ich __ öffne. Bei Form2 wird die MessageBox so angezeigt, als würde ich die Anwendung ausführen

Wenn Sie dies bemerken, erhalten Sie diese Fehlermeldung im Designer von Form1 nicht. Da jedoch Ihr Form2 von Form1 erbt, erhalten Sie diese Fehlermeldung.

Dies liegt daran, dass der Designer beim Öffnen eines Formulars in Designer eine Instanz von base class Ihres Formulars erstellt, um Ihr Formular anzuzeigen. Anstatt eine Instanz von Form2 zu erstellen, erstellt sie eine Instanz von Form1, führt Form1-Konstruktor aus und hostet sie in der Entwurfsoberfläche, deserialisiert dann die Codes in InitializeComponent von Form2 und platziert Komponenten auf der Entwurfsoberfläche.

Aus diesem Grund wird die Fehlermeldung angezeigt, wenn Sie Ihren Form2 in Designer sehen, aber beim Öffnen des Form1 in Designer keine Fehlermeldung angezeigt wurde.

Um das Problem zu lösen:

  • Sie können die Implementierung entfernen und die Implementierung leer lassen.
  • Sie können den Fehler auch verhindern, indem Sie die Ausführung des Codes in Form_Load fd, den Sie sich im Entwurfsmodus befinden, mit der Eigenschaft DesignMode in Form1_Load verhindern:

    if (DesignMode) Rückkehr;

Sie werden diese Antworten wahrscheinlich hilfreich und interessant finden:

11
Reza Aghaei

Was ist los und wie wird das Problem gelöst?

Das ist ziemlich trivial. Wenn Sie Ihren Code debuggen würden, würden Sie feststellen, dass Sie in Ihrem Methodenaufruf eine NotImplementedException werfen. Aus diesem Grund funktioniert das Auskommentieren:

public void Retrive()
{
    throw new NotImplementedException();
}

Anstatt zu werfen, möchten Sie vielleicht die eigentliche Methodenlogik implementieren.

4
Yuval Itzchakov

Kommentieren der Teil werfen neue NotImplementedException (); funktionierte gut für michJetzt wird die Methode wie folgt aussehen:

public void Retrive()
{
    //throw new NotImplementedException();
}
1
Anjan Kant