该方法或操作未实现

Mik*_*hin 7 .net c# inheritance windows-forms-designer winforms

有两种形式.Form2源自Form1.

但是我在设计模式下遇到了Form2的问题,如下面的屏幕截图所示.

如果我对此发表评论this._presenter.Retrive();,它将正常工作.是怎么回事以及如何解决这个问题?

UPD: 如果我将删除throw new NotImplementedException(); 并将插入,例如,MessageBox.Show("Test");,每次我打开Form2时,MessageBox都会出现,就像我运行应用程序一样.

在此输入图像描述

窗体2

namespace InheritanceDemo
{
    public partial class Form2 : Form1
    {
        public Form2()
        {
            InitializeComponent();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Form1中

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();
    }
}
Run Code Online (Sandbox Code Playgroud)

Rez*_*aei 12

造成错误的主要原因是FᴀʀʜᴀɴYuval说:

throw new NotImplementedException();
Run Code Online (Sandbox Code Playgroud)

但是你应该注意另一个重要的事情.

OP:如果我将删除throw new NotImplementedException(); 并将插入,例如,MessageBox.Show("Test");,每次我打开Form2时,MessageBox将显示为好像我运行应用程序

如果您注意到,您将不会在设计器中收到此错误Form1.但是因为你Form2Form1你那里继承了这个错误.

这是因为,当您在设计器中打开表单时,设计器会创建表单基类的实例来显示您的表单.这意味着代替创建一个实例Form2它创建的一个实例Form1,运行Form1构造和承载它在设计表面上,然后在反序列化代码InitializeComponentForm2,并把在设计表面上的部件.

这就是您在看到Form2设计人员时收到错误的原因,但是在打开Form1设计器时没有收到任何错误.

解决问题:

  • 您可以删除实现,并让实现为空.
  • 此外,您可以通过Form_Load使用DesignMode属性阻止在fd处于设计模式下运行代码来防止错误Form1_Load:

    if(DesignMode)返回;

您可能会发现这些答案有用且有趣:


Yuv*_*kov 5

这是怎么回事以及如何解决问题?

这是相当微不足道的。如果您要调试代码,您会发现您NotImplementedException在方法调用中抛出了一个,这就是注释掉它的原因:

public void Retrive()
{
    throw new NotImplementedException();
}
Run Code Online (Sandbox Code Playgroud)

也许您想实现实际的方法逻辑,而不是抛出异常。