2009-07-14 9 views
7

私はwinフォームアプリケーションの統合テストを駆動するための小さなクラスを作成しています。テストドライバクラスは、メインフォームへのアクセス権を持ち、名前で使用する必要があるコントロールを検索し、テストを実行するために使用します。私はControl.Controlsツリーを横断しているコントロールを見つけるために。しかし、私はダイアログウィンドウ(ダイアログとして表示されたカスタムフォーム)でコントロールに移動したいときに動かなくなってしまいます。どうすればそれを保持できますか?現在アクティブなモーダルフォームへの参照はどのように取得できますか?

答えて

20

静的Form.ActiveFormプロパティを使用すると、現在アクティブなフォームへの参照を取得できます。

編集:Formにフォーカスがない場合、Form.ActiveFormnullを返します。これを回避するために
一つの方法は、ShowDialog使用して表示されたとき、魔女はアクティブFormになりますApplication.OpenFormsコレクションを使用して最後アイテムを取得することです:私が間違っている場合

// using Linq: 
lastOpenedForm = Application.OpenForms.Cast<Form>().Last() 
// or (without Linq): 
lastOpenedForm = Application.OpenForms[Application.OpenForms.Count - 1] 
+0

私は何をしてもnullを返すようです。何か案は? – Grzenio

+0

フォームにフォーカスがないときに更新されました –

+0

Application.OpenForms works、cheers – Grzenio

0

事前に作成されたダイアログボックスのコントロールにアクセスできるかどうかはわかりません。彼らはすべて一緒にパッケージ化されているようだ。あなたは自分が望むことをするあなた自身のダイアログボックスを構築することが、より多くの運を持つかもしれません。次に、内部の.Controlsにアクセスできます。

+0

はい、私はダイアログボックスとして表示されるカスタムフォームを使用しています – Grzenio

0

が私を修正し、しかし、ダイアログフォーム上のコントロールにアクセスしようとしている可能性が高い場合は、あたかも可能です。

ShowDialogは、ShowDialogがフォームが作成されたスレッドを「ホールドアップ」し、ShowDialogが処理を完了するまでアプリケーション(またはテストクラス)に制御を返しません。この場合、ユーザーコードその道のりで続けるだろう。

コントロールを別のスレッド(この場合は、テストドライバクラスをリファクタリングして、表示およびテストする必要がある新しいフォームごとに別のスレッドを生成する)からアクセスまたは操作してみてください。

+0

はい、新しいスレッドを作成したので、ブロックされません。 @Julien Poulinが提供する答えを探していた – Grzenio

+0

また、親フォームを処分する場合、disposeメソッドはアクティブなモーダルフォームでも実行されます。可能であれば、モーダルフォームにアクセスすることができます。 – mike100111

関連する問題