2011-07-05 2 views
3

私は自分のアプリケーションのメニューフォームを持っていますので、それを祖父母と呼ぶことにしましょう。ユーザーがボタンをクリックすると、form.show()を使用して別のフォームが呼び出され、親フォームと呼ばれます。 show()を使用し、showdialog()を使用しなかったので、どちらの形式でも再生できます。form.showdialogがDotNetの祖父母フォームをロックするのを止めるにはどうすればいいですか?

親フォームでは、form.showdialog()を使用して3番目のフォームを子フォームと呼びます。親フォームで何かできるようになる前に、ユーザーが子フォームを閉じる必要があります。問題は、今私は祖父母のフォームを使うことができないということです。子フォームを閉じるまでロックされています。

つまり、私は子フォームをモーダルにしたいが、親フォームに対してのみ、祖父母フォームではない。そのようなことはできますか?

+1

モーダルが悪いです。これは、通常、開発者が自分が考えた唯一のものとは異なるワークフローを持っていると想像するのが面倒だということを意味します。 –

+0

これは、このように動作することが非常に重要です。なぜこの答えが説明されているのですか?http://stackoverflow.com/questions/5181777/c-application-doevents/5183623#5183623あなたは、EnableWindow()メソッドをShowDialog()の前にControl.BeginInvoke()で開始します。 –

+0

リンクHansさん、ありがとう、それはとても面白かったです。 –

答えて

3

親と子のフォームが祖父母よりも別のスレッドで稼働している場合(つまり、別のスレッドでコントロールを使用する必要があるときに呼び出す必要があります)、2番目のUIスレッドを開始できますあなたの親フォーム...

モーダルダイアログブロック親フォームのUIスレッドのメッセージキューは、祖父母のUIスレッドはまだ、独自の非ブロックされたメッセージキューを持っています...

ので、代わりに呼び出します

new ParentForm().Show(); 

あなたの祖父母電話のコードのどこか

new System.Threading.Thread(
        delegate() { 
         Application.Run(new ParentForm()); 
        } 
       ).Start(); 
+0

ありがとう、それは美しく働いた。祖父母と親のフォームは実際には相互作用しませんので、別のスレッドがうまく動作します。 –

+0

注 - UIキューがブロックされていない場合、.Netは他のプログラムのウィンドウをすべて無効にして、許可されている場合にはほとんどのプログラムで改ざんされないようにします。 – FastAl

0

ShowDialog()はUIスレッドをブロックするので、簡単にはできないと思います。あなたは新しいプロセスで子フォームを起動することができます...それはかなり劇的です。

親フォームを手動で無効にすることができます(すべてのコントロールを無効にする - すべてをUserControlまたはPanelに置き、無効にするだけです)。その後、ユーザーが親フォームをクリックして「最初に閉じるように」と言われたら、メッセージを投げることができます。子フォームが閉じたら、親を再度有効にします。

子フォームが表示されたままになっていることを確認したい場合は、TopMostプロパティを設定しますが、実際にユーザーを迷惑にする可能性があるため、注意してください。

関連する問題