2016-07-19 1 views
1

Visual Studio 2013、Visual C#、Windowsフォームアプリケーション。Windows Formの所有者を参照するにはどうすればよいですか?

私は2つのフォームクラスに興味があります。 GameForm.csの後GameForm.cs

最初のポップアップは、ユーザーが2番目のポップアップボタンをクリックした場合のみ表示されます。

AfterTheGameForm afterTheGameForm = new AfterTheGameForm(); 
afterTheGameForm.Show(this); 

したがって、TheGameFormがAfterTheGameFormの所有者であることは明らかです。ここに私の問題があります... AfterTheGameFormクラスで私は所有者クラスを参照して、その特定のメソッドを使用したいと考えています。私は所有者がタイプTheGameFormであることを確実に知っていると私はキャストしようとしています:

TheGameForm gForm = (TheGameForm)this.Owner; 
     if(gForm!=null){    
      MessageBox.Show(theGameForm.CheckedRadioButton); 
     } 
     else 
     { 
      MessageBox.Show("theGameForm==null"); 
     } 

私もこのキャストを試してみました:

TheGameForm gForm = this.Owner as TheGameForm; 

gFormオブジェクトがnullであります!これはどのように可能ですか?

+0

いいえ[mcve]がなければ、コード内の問題を診断することは不可能です。つまり、あなたが投稿した少しのコードから、あなたの 'AfterTheGameForm'は' TheGameForm'に非常に強く結びついている、つまりタイプを認識していて、クラスの特定のメンバーに直接アクセスしていることは明らかです。より良いデザインでは、イベントやその他の抽象化を使用して、フォームを実際には互いに結びつけることなく相互作用させることができます。言い換えると、AfterTheGameFormは、ここで正しいことが設定されるための 'Owner'プロパティを設定する必要はありません。 –

+0

ええ、あなたは正しいです。私は良いコードを設計する方法を知らない、それは私の問題です! :)私はその解決策を所有者と見つけ、それを使用しようとしました。 – Skemelio

+0

それを見つける別の方法は、 'TheGameForm gForm = Application.OpenForms.OfType ().FirstOrDefault();' – Slai

答えて

5

おそらく、コンストラクタでアクセスしている可能性があります。 Ownerは、コンストラクタの後に設定されます。 Loadイベントをお試しください。

+0

なぜ元のコードはコンストラクタで 'Owner'を使用しようとしていますか?おそらくOPは、少なくともShow()メソッドを呼び出す前にコンストラクタが戻る必要があるため、Ownerメソッドをそこに設定することはできないと少なくとも理解しています。 –

+0

実際には、所有者がコンストラクタの後に設定されているという事実はおそらく助けになります! – Skemelio

+0

@PeterDunihoあなたは私の人です! – Skemelio

関連する問題