Wie deaktiviere ich das übergeordnete Formular, wenn ein untergeordnetes Formular aktiv ist?

72

Wie deaktiviere ich ein übergeordnetes Formular, wenn das untergeordnete Formular mit c # aktiv ist?

Spontifixus
quelle
Können Sie nicht einfach ChildForm.show und dann Mainform.disable / .hide verwenden oder sprechen Sie davon, dass zwei Formulare gleichzeitig aktiv sind und wenn das untergeordnete Formular aktiviert ist (aktiv, um das Hauptformular zu deaktivieren), aktivieren Sie das Hauptformular erneut (nicht fokussieren) ?
Don Thomas Boyle
@DonThomasBoyle: Hey Mann, ich suche genau Ihre beschriebene Lösung "Wenn 2 Formulare gleichzeitig aktiv sind und wenn das untergeordnete Formular aktiv ist (aktiv, um das Hauptformular zu deaktivieren), dann aktivieren Sie das Hauptformular auf (nicht fokussieren)" können Sie mir geben ein Hinweis, wie man das löst? Ich habe es mit Threading, application.run usw. versucht, aber nichts funktioniert. Wie würden Sie das realisieren?
ア ロ デ ィ

Antworten:

188

Haben Sie versucht, Form.ShowDialog () anstelle von Form.Show () zu verwenden ?

ShowDialog zeigt Ihr Fenster als modal an. Dies bedeutet, dass Sie erst mit dem übergeordneten Formular interagieren können, wenn es geschlossen wird.

R. Martinho Fernandes
quelle
Versteckt dies nicht das übergeordnete Formular?
Barlop
@barlop, um die Verwendung this.Hide()des übergeordneten Formulars im übergeordneten Formularcode auszublenden .
Vee
@vee Du hast mich falsch verstanden. Ich fragte, warum es so schien, als würde es sich verstecken (wenn ich es nicht wollte). Mein Problem, behoben, war dieses stackoverflow.com/questions/38171607/…
barlop
Danke @R. Martinho Fernandes, das funktioniert einwandfrei!
Jemil Oyebisi
37

Rufen Sie an ShowDialog()oder nur Show()auf Ihrem Kinderformular aus dem Elternformular?

ShowDialogblockiert den Benutzer für die Interaktion mit dem Formular, das als Parameter an übergeben wird ShowDialog.

Innerhalb des Elternteils könnten Sie so etwas nennen wie:

MyChildForm childForm = new MyChildForm();

childForm.ShowDialog(this);

Wo thisist das übergeordnete Formular?

Philip
quelle
Funktioniert bei mir! VB.Net-Version ist dies: Public childForm As New Childformclassund childForm.ShowDialog(Me)wo ich die Klasse Eltern (Elternform) ist, vielen Dank @Philip
Ignacio Bustos
15

Es ist einfach zu bedienen

  Form.ShowDialog();

Stattdessen

  Form.Show();

Während der Verwendung können Form.ShowDialog()Sie nicht mit dem übergeordneten Formular interagieren, bis es geschlossen wird.

Rizwan Ansari
quelle
wenn ich es versuche, finde ich, dass das es verbirgt
barlop
10

Sie können sicherstellen, dass Sie das übergeordnete Formular als Eigentümer übergeben, wenn Sie das untergeordnete Formular anzeigen:

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

Richten Sie dann in der untergeordneten Form Ereignishandler für die Ereignisse Activatedund ein 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;
    }
}

Dies führt jedoch zu einem wirklich seltsamen Verhalten. Während Sie nicht sofort zurückkehren und mit dem übergeordneten Formular interagieren können, wird es durch Aktivieren einer anderen Anwendung aktiviert, und der Benutzer kann dann mit ihm interagieren.

Wenn Sie das untergeordnete Formular modal machen möchten , verwenden Sie ShowDialogstattdessen:

  Form newForm = new ChildForm();
  newForm.ShowDialog(this);
Fredrik Mörk
quelle
Sie können auch Form_Closed anstelle von Form_Deactivate verarbeiten, wenn Sie das übergeordnete Formular für die Lebensdauer des untergeordneten Formulars deaktivieren möchten, unabhängig davon, ob andere Formulare oder Anwendungen in der Zwischenzeit aktiviert werden.
JamesFaix
8

Während Sie das zuvor erwähnte childForm.ShowDialog (this) verwenden, wird Ihr Hauptformular deaktiviert, es sieht jedoch immer noch sehr deaktiviert aus. Wenn Sie jedoch Enabled = false vor ShowDialog () und Enable = true nach dem Aufruf von ShowDialog () aufrufen, sieht das Hauptformular sogar so aus, als wäre es deaktiviert.

var childForm = new Form();
Enabled = false;
childForm .ShowDialog(this);
Enabled = true;
helgeheldre
quelle
Ich sehe nicht, wie das funktionieren kann. Wenn ich es versuche, verbirgt es die übergeordnete Form
Barlop
6
ChildForm child = new ChildForm();
child.Owner = this;
child.Show();

// In ChildForm_Load:

private void ChildForm_Load(object sender, EventArgs e) 
{
  this.Owner.Enabled = false;
}

private void ChildForm_Closed(object sender, EventArgs e) 
{
  this.Owner.Enabled = true;
} 

Quelle: http://social.msdn.microsoft.com/Forums/vstudio/en-US/ae8ef4ef-3ac9-43d2-b883-20abd34f0e55/how-can-i-open-a-child-window-and-block- Nur das übergeordnete Fenster

Stapel
quelle
4
Form1 frmnew = new Form1();
frmnew.ShowDialog();
senthilkumar2185
quelle
4

@ Melodia

Entschuldigung, dies ist kein C # -Code, aber dies ist das, was Sie möchten. Außerdem sollte die Übersetzung einfach sein.

FORM 1

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

Hoffe das hilft

Don Thomas Boyle
quelle
Danke vielmals! Ihre Idee ist großartig! Ich habe gerade herausgefunden, dass es auch funktioniert, indem ich mit Eltern arbeite und Kinder an sie andocke.
ア ロ デ ィ
4

Sie können dies mit folgendem tun:

Form3 formshow = new Form3();

formshow.ShowDialog();
Manischer Sharma
quelle
2

Sie können auch das MDIParent-Child-Formular verwenden. Legen Sie das übergeordnete Element des untergeordneten Formulars als übergeordnetes MDI fest

Z.B

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

In diesem Fall wird nur 1 Formular angezeigt und die untergeordneten Formulare werden in das übergeordnete Formular eingefügt. Hoffe das hilft

Nisha
quelle
1

Für mich funktioniert diese Arbeit hier zum Beispiel, wenn das Hauptmenü deaktiviert wird, wenn Sie das Registrierungsformular öffnen.

 frmUserRegistration frmMainMenu = new frmUserRegistration();
    frmMainMenu.ShowDialog(this);
user3856440
quelle
1

Wenn Sie nur versuchen, einen Form.ShowDialog-Aufruf zu simulieren, aber OHNE irgendetwas zu blockieren (ein bisschen wie ein simuliertes Dialogformular), können Sie Form.Show () verwenden. Sobald Sie das simulierte Dialogformular anzeigen, deaktivieren Sie sofort alle anderen Fenster mit etwas wie...

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

Wenn Sie dann Ihr "Pseudo-Dialogformular" schließen, rufen Sie unbedingt ....

private void EnableAllWindows()
{
foreach (Form f in Application.OpenForms) f.Enabled = true;
}
SnowMan50
quelle
-2

Warum nicht einfach die Eltern warten lassen, bis das Kind geschlossen ist? Das ist mehr als Sie brauchen.

// Execute child process
System.Diagnostics.Process proc = 
    System.Diagnostics.Process.Start("notepad.exe");
proc.WaitForExit();
elektrisch
quelle
1
-1: Wagen Sie es nie, dies in Click / Press / Mouse / Key-Handlern zu tun. Info: stackoverflow.com/questions/470256/...
quetzalcoatl
Bei dieser Antwort geht es um PROZESSE, nicht um FORMEN. Nützlich für jemanden, geht aber nicht auf die Frage ein. Es ist auch eine wirklich schlechte Idee, wenn dies über den GUI-Thread erfolgt - Ihre App-GUI wird gesperrt, bis der andere Prozess zurückkehrt -, wenn etwas schief geht, muss der Benutzer auf den Task-Manager zurückgreifen, um Ihre App zu beenden. MIT VORSICHT VERWENDEN! Oder noch besser: Verwenden Sie eine ASYNCHRONOUS-Lösung anstelle von WaitForExit.
ToolmakerSteve