2009-07-15 33 views
59

子フォームがC#を使用してアクティブなときに親フォームを無効にするにはどうすればよいですか?子フォームがアクティブなときに親フォームを無効にする方法はありますか?

+0

MainForm.disable/.hideを使ってChildForm.showを使うことはできませんか?また、同時に2つのフォームをアクティブにして、子フォームが(メインを無効にするためにアクティブになっている) mainforMを有効にしますか? –

+0

@DonThomasBoyle:ちょっと男、私はあなたの記述されたソリューションを正確に探しています "同時に2つのフォームをアクティブにして、子フォームが(メインを無効にするためにアクティブになって)次にオンにすると、メインフォールトを再度アクティブにします" 私にそれを解決するためのヒントを教えてください。私はthreading、application.runなどで試してみましたが、何も動作しません。これはどうやって分かりますか? – melodia

答えて

161

Form.Show()の代わりにForm.ShowDialog()を試しましたか?

ShowDialogは、あなたのウィンドウをモーダルとして表示します。つまり、閉じられるまで親フォームと対話できません。

+0

これは親フォームを非表示にしていませんか? – barlop

+0

@barlop親フォームを非表示にするには、親フォームコードで 'this.Hide()'を使用します。 – vee

+0

@veeあなたは私を読んでいません。私はなぜそれを隠すように見えるのか(私がそれを望んでいないとき)を尋ねていた。私の問題は解決しました。これはこれでしたか?http://stackoverflow.com/questions/38171607/c-sharp-winforms-how-can-i-get-the-child-form-in-front-of-parent-form-without – barlop

33

親フォームから子フォームのShowDialog()またはShow()を呼び出していますか?

ShowDialogは、ユーザーがフォームとして使用して、フォームとして使用して、ShowDialogに渡すことを「ブロック」します。あなたのようなものを呼ぶかもしれない親の中

thisが親フォームである

​​

Activatedのイベントハンドラを設定し、子フォームで、

Form newForm = new ChildForm(); 
    newForm.Show(this); 

その後:あなたはは何ができるか

+0

私のために働く! VB.Netのバージョンはこれです: 'Public childForm As New Childformclass'と' childForm.ShowDialog(Me) 'ここでMeはクラスの親(親フォーム)ですので大変ありがとうございます@Philip –

8

は、子フォームを表示するときに所有者として親フォームに合格することを確認することですそしてDeactivateイベント:

private void Form_Activated(object sender, System.EventArgs e) 
{ 
    if (this.Owner != null) 
    { 
     this.Owner.Enabled = false; 
    } 
} 

private void Form_Deactivate(object sender, System.EventArgs e) 
{ 
    if (this.Owner != null) 
    { 
     this.Owner.Enabled = true; 
    } 
} 

はしかし、これは本当に奇妙な行動になります。あなたは戻って親フォームと直ちにやりとりすることはできませんが、他のアプリケーションをアクティブにするとそれが有効になり、ユーザーはそれを操作できます。

あなたは、子フォームmodalを作る代わりにShowDialogを使用したい場合:

Form newForm = new ChildForm(); 
    newForm.ShowDialog(this); 
+0

Form_Deactivateの代わりにForm_Closedを処理することもできますifその間にアクティブ化されている他のフォームやアプリケーションに関係なく、子フォームの存続期間中に親フォームを無効にしたいとします。 – JamesFaix

-2

が理由だけではなく、子供が閉鎖するために親が待っていません。これはあなたが必要以上のものです。

// Execute child process 
System.Diagnostics.Process proc = 
    System.Diagnostics.Process.Start("notepad.exe"); 
proc.WaitForExit(); 
+1

-1:クリック/プレス/マウス/キーハンドラーでこれを行うことを敢えてしないでください。 Info:http://stackoverflow.com/questions/470256/process-waitforexit-asynchronously – quetzalcoatl

+0

この回答はプロセスに関するものであり、FORMSに関するものではありません。誰かには役に立ちますが、質問には答えません。また、GUIスレッド上で実行すると、本当に悪い考えです。アプリのGUIは、他のプロセスが戻るまでロックされます。何か問題が生じた場合、ユーザーはアプリを終了させるためにタスクマネージャに頼らざるを得なくなります。注意して使用してください!またはそれ以上:WaitForExitではなく、いくつかの非同期ソリューションを使用します。 – ToolmakerSteve

7

前述のchildForm.ShowDialogを使用すると、メインフォームが無効になりますが、それでもなお非常に無効に見えます。しかし、ShowDialog()を呼び出した後、ShowDialog()およびEnable = trueの前にEnabled = falseを呼び出すと、メインフォームは無効になっているように見えます。 ChildForm_Loadで

var childForm = new Form(); 
Enabled = false; 
childForm .ShowDialog(this); 
Enabled = true; 
+0

これはどのように動作するのかわかりません。試してみると親フォームが隠されています – barlop

4
Form1 frmnew = new Form1(); 
frmnew.ShowDialog(); 
2

またMDIParent-子フォームを使用することができます。ちょうど1フォームが表示されます。この場合、MDI親

例:

child.MdiParent = parentForm; 
child.Show(); 

として子フォームの親を設定し、子フォームは、親の内側に来ます。Form.ShowDialog()を使用している間 希望は、これが

13

に役立ちますシンプルな、それが閉じるまで、あなたが親フォームと対話することができない代わりに

Form.Show(); 

Form.ShowDialog(); 

を使用しています。

+0

私はそれを試してみると、それを隠すことがわかります – barlop

4

@Melodia

このため申し訳ありませんがC#コードではありませんが、これは、あなたが、これは簡単なはず翻訳以外にも、望むものです。

FORM1

Private Sub Form1_MouseEnter(sender As Object, e As EventArgs) Handles MyBase.MouseEnter 
    Me.Focus() 
    Me.Enabled = True 
    Form2.Enabled = False 
End Sub 

Private Sub Form1_MouseLeave(sender As Object, e As EventArgs) Handles MyBase.MouseLeave 
    Form2.Enabled = True 
    Form2.Focus() 
End Sub 

FORM2

Private Sub Form2_MouseEnter(sender As Object, e As EventArgs) Handles MyBase.MouseEnter 
    Me.Focus() 
    Me.Enabled = True 
    Form1.Enabled = False 
End Sub 

Private Sub Form2_MouseLeave(sender As Object, e As EventArgs) Handles MyBase.MouseLeave 
    Form1.Enabled = True 
    Form1.Focus() 
End Sub 

希望これはここで私のために例えば、この作業を

+0

ありがとう!あなたのアイデアは素晴らしいです!私はちょうどそれがフォームの親と一緒に働き、子供たちを彼らにドッキングすることによっても機能することを知りました。 – melodia

1

に役立ちます何が起こることは、あなたが開くと、メインメニューが無効になりますです登録フォーム。

frmUserRegistration frmMainMenu = new frmUserRegistration(); 
    frmMainMenu.ShowDialog(this); 
0

あなただけのForm.ShowDialogコールをシミュレートしようとしているが、(ちょっと模擬ダイアログフォームのような)何かをブロックすることなく、あなたがForm.Showを(使用して試すことができます)とすぐにシミュレートされたダイアログフォームを表示している場合あなたは「擬似ダイアログフォーム」と呼ぶようにしてくださいを閉じたときに、すぐに....そして、...

private void EnableAllWindows() 
{ 
foreach (Form f in Application.OpenForms) f.Enabled = true; 
} 
1

あなたはトンを行うことができますが

private void DisableAllWindows() 
{ 
foreach (Form f in Application.OpenForms) 
if (f.Name != this.Name)f.Enabled = false; 
else f.Focus(); 
} 

をのようなものを使用して他のすべてのウィンドウを無効にします帽子。

Form3 formshow = new Form3();

formshow.ShowDialog();

関連する問題