回避策があるファンキーな問題がありますが、コードをできるだけ似たものにしたいと考えています。この問題は、null である場合とそうでない場合があるユーザー コントロールの基本クラスの特定の変数に集中しており、null であってはなりません。
基本的に、メイン フォーム ウィンドウのインスタンスを取得する単一の基本クラスを持つ多数のユーザー コントロールがあるため、ユーザー コントロールはメイン フォームのプロパティにアクセスし、メイン フォームのメソッドを呼び出すことができます。スニペットを次に示します (this.frmParent はパブリック メンバーです)。
private void ucBase_Load( object sender, EventArgs e )
{
// Establish the link to the main form.
this.frmParent = FindForm() as frmMain;
}
次に、各ユーザー コントロールがこの基本クラスを共有します。
public partial class ucLiberty : ucBase
次に、メイン フォームで、次のようにユーザー コントロールを呼び出します。
ucLiberty Liberty = new ucLiberty();
IQDevicePath = Liberty.GetIQDrivePath();
何らかの理由で、ユーザー コントロールをインスタンス化すると (この場合はメイン フォームにあります)、基本クラスの frmParent 変数に null 以外の値が設定される場合とされない場合があります。
ユーザー コントロールのロード イベントが発生していないことに気付きました。コントロールの作成を強制することになっている CreateControl() というメソッドを見つけた後、load イベントが発生し始めましたが、デバッガーで実行をトレースし、frmParent を設定しようとしていた基本クラスに到達したときに、 FindForm() は常に null 以外の値を返すとは限りませんでした。
この問題が発生しない他のユーザー コントロールがありますが、それらの違いは、一部のユーザー コントロールには子コントロールがあり、一部には子コントロールがないことです。子コントロールのないものにはこの問題があります。
私の回避策は、FindForm() が失敗したユーザー コントロールを監視し、そのユーザー コントロールのロード イベントで、メイン フォームのコンストラクターへの呼び出しで値を割り当てることです。
this.frmParent = new frmMain();
ただし、load イベントを発生させるには、CreateControl() を呼び出す必要があります。また、将来のメンテナーに、さまざまな動作命令に関する明示的な知識を持たせる必要があるという考えは好きではありません。つまり、メンテナンスを簡単にするために、すべてのユーザー コントロールが同じように機能するようにしたいと考えています。
コードを分解したところ、ユーザー コントロールのロード イベントが発生する場合と発生しない場合がある理由、およびユーザー コントロールの基本クラスでの FindForm() の呼び出しが失敗する理由がわかりません。
これらの問題を解決する方法について誰かアイデアがありますか? ありがとう。