2つの形式があります。 Form2はForm1から派生します。
しかし、次のスクリーンショットに示すように、デザインモードでForm2に問題があります。
このthis._presenter.Retrive();
をコメントする場合、問題なく動作します。何が起こっており、問題を解決する方法は?
UPD:throwを削除する場合、新しいNotImplementedException();そして、たとえば、MessageBox.Show( "Test");を挿入します。Form2を開くたびに、アプリケーションを実行するようにMessageBoxが表示されます。
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();
}
}
エラーの主な原因は Fᴀʀʜᴀɴ および Yuval が言ったことです:
throw new NotImplementedException();
しかし、注意する必要があるもう1つの重要なことがあります。
OP:throwを削除する場合new NotImplementedException();そして、たとえば、MessageBox.Show( "Test");を挿入します。Form2を開くたびに、アプリケーションを実行するかのようにMessageBoxが表示されます。
気づいた場合、Form1
のデザイナーでこのエラーは表示されません。ただし、Form2
はForm1
を継承するため、このエラーが発生します。
デザイナーでフォームを開くと、デザイナーがフォームのベースクラスのインスタンスを作成してフォームを表示するためです。 Form2
のインスタンスを作成する代わりに、Form1
のインスタンスを作成し、Form1
コンストラクターを実行してデザインサーフェイスでホストし、Form2
のInitializeComponent
のコードを逆シリアル化し、コンポーネントをデザインサーフェイスに配置します。
デザイナーでForm2
を表示したときにエラーが表示されるのはこのためですが、デザイナーでForm1
を開いているときにエラーは表示されませんでした。
問題を解決するため:
また、Form_Load
の DesignMode
プロパティを使用して、設計モードのForm1_Load
fdでコードを実行しないようにすることで、エラーを防ぐことができます。
if(DesignMode)return;
おそらく、これらの答えは役に立つと面白いでしょう。
何が起こっており、問題を解決する方法は?
これはかなり簡単です。コードをデバッグする場合は、メソッド呼び出しでNotImplementedException
をスローしていることがわかります。これがコメントアウトが機能する理由です。
public void Retrive()
{
throw new NotImplementedException();
}
スローする代わりに、実際のメソッドロジックを実装することもできます。
コメントアウトパートthrow newNotImplementedException();私にとってはうまくいきました。
public void Retrive()
{
//throw new NotImplementedException();
}