web-dev-qa-db-ja.com

メソッドまたは操作は実装されていません

2つの形式があります。 Form2Form1から派生します。

しかし、次のスクリーンショットに示すように、デザインモードでForm2に問題があります。

このthis._presenter.Retrive();をコメントする場合、問題なく動作します。何が起こっており、問題を解決する方法は?

UPD:throwを削除する場合、新しいNotImplementedException();そして、たとえば、MessageBox.Show( "Test");を挿入します。Form2を開くたびに、アプリケーションを実行するようにMessageBoxが表示されます。

enter image description here

Form2

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

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();
    }
}
7
Mikhail Danshin

エラーの主な原因は Fᴀʀʜᴀɴ および Yuval が言ったことです:

throw new NotImplementedException();

しかし、注意する必要があるもう1つの重要なことがあります。

OP:throwを削除する場合new NotImplementedException();そして、たとえば、MessageBox.Show( "Test");を挿入します。Form2を開くたびに、アプリケーションを実行するかのようにMessageBoxが表示されます。

気づいた場合、Form1のデザイナーでこのエラーは表示されません。ただし、Form2Form1を継承するため、このエラーが発生します。

デザイナーでフォームを開くと、デザイナーがフォームのベースクラスのインスタンスを作成してフォームを表示するためです。 Form2のインスタンスを作成する代わりに、Form1のインスタンスを作成し、Form1コンストラクターを実行してデザインサーフェイスでホストし、Form2InitializeComponentのコードを逆シリアル化し、コンポーネントをデザインサーフェイスに配置します。

デザイナーでForm2を表示したときにエラーが表示されるのはこのためですが、デザイナーでForm1を開いているときにエラーは表示されませんでした。

問題を解決するため:

  • 実装を削除して、実装を空にすることができます。
  • また、Form_LoadDesignMode プロパティを使用して、設計モードのForm1_Load fdでコードを実行しないようにすることで、エラーを防ぐことができます。

    if(DesignMode)return;

おそらく、これらの答えは役に立つと面白いでしょう。

12
Reza Aghaei

何が起こっており、問題を解決する方法は?

これはかなり簡単です。コードをデバッグする場合は、メソッド呼び出しでNotImplementedExceptionをスローしていることがわかります。これがコメントアウトが機能する理由です。

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

スローする代わりに、実際のメソッドロジックを実装することもできます。

4
Yuval Itzchakov

コメントアウトパートthrow newNotImplementedException();私にとってはうまくいきました。

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