Comment désactiver un formulaire parent lorsque le formulaire enfant est actif en utilisant c #?
Avez-vous essayé d’utiliser Form.ShowDialog () au lieu de Form.Show () ?
ShowDialog affiche votre fenêtre en tant que modale, ce qui signifie que vous ne pouvez pas interagir avec le formulaire parent tant qu’il ne se ferme pas.
Show()
-vous ShowDialog()
ou simplement Show()
sur votre formulaire enfant à partir du formulaire parent?
ShowDialog
“empêchera” l’utilisateur d’interagir avec le formulaire transmis en tant que paramètre à ShowDialog
.
Au sein du parent, vous pourriez appeler quelque chose comme:
MyChildForm childForm = new MyChildForm(); childForm.ShowDialog(this);
où c’est le formulaire parent.
C’est simple, utiliser
Form.ShowDialog();
Au lieu
Form.Show();
Lors de l’utilisation de Form.ShowDialog()
vous ne pouvez pas interagir avec le formulaire parent tant qu’il ne se ferme pas.
Ce que vous pouvez faire, c’est de vous assurer de transmettre le formulaire parent en tant que propriétaire lors de l’affichage du formulaire enfant:
Form newForm = new ChildForm(); newForm.Show(this);
Ensuite, dans le formulaire enfant, configurez des gestionnaires d’événements pour les événements Activated
et 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; } }
Cependant, cela se traduira par un comportement vraiment plus étrange; Bien que vous ne puissiez pas revenir en arrière et interagir immédiatement avec le formulaire parent, l’activation de toute autre application le permet et l’utilisateur peut alors interagir avec lui.
Si vous voulez que le formulaire enfant soit modal , utilisez plutôt ShowDialog
:
Form newForm = new ChildForm(); newForm.ShowDialog(this);
En utilisant le childForm.ShowDialog mentionné précédemment (this), votre formulaire principal sera désactivé, mais il semble toujours très désactivé. Cependant, si vous appelez Enabled = false avant ShowDialog () et Enable = true après avoir appelé ShowDialog (), le formulaire principal semblera même être désactivé.
var childForm = new Form(); Enabled = false; childForm .ShowDialog(this); Enabled = true;
ChildForm child = new ChildForm(); child.Owner = this; child.Show();
// Dans 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; }
source: http://social.msdn.microsoft.com/Forums/vstudio/en-US/ae8ef4ef-3ac9-43d2-b883-20abd34f0e55/how-can-i-open-a-child-window-and-block- the-parent-window-only
Form1 frmnew = new Form1(); frmnew.ShowDialog();
@Melodia
Désolé pour ce n’est pas le code C # mais c’est ce que vous voudriez, en plus de traduire cela devrait être facile.
FORMULAIRE 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
J’espère que cela t’aides
Vous pouvez le faire.
Form3 formshow = new Form3 ();
formshow.ShowDialog ();
Vous pouvez également utiliser le formulaire MDIParent-child. Définissez le parent du formulaire enfant comme parent MDI
Par exemple
child.MdiParent = parentForm; child.Show();
Dans ce cas, un seul formulaire sera affiché et les formulaires enfants apparaîtront dans le parent. J’espère que cela t’aides
Pour moi, ce travail par exemple ici ce qui se passe est que le menu principal sera désactivé lorsque vous ouvrez le formulaire d’inscription.
frmUserRegistration frmMainMenu = new frmUserRegistration(); frmMainMenu.ShowDialog(this);
Si vous essayez juste de simuler un appel Form.ShowDialog mais SANS bloquer quoi que ce soit (un peu comme un formulaire de dialog simulé), vous pouvez essayer d’utiliser Form.Show () et dès que vous affichez la boîte de dialog simulée, désactivez immédiatement toutes les autres fenêtres en utilisant quelque chose comme…
private void DisableAllWindows() { foreach (Form f in Application.OpenForms) if (f.Name != this.Name)f.Enabled = false; else f.Focus(); }
Ensuite, lorsque vous fermez votre “pseudo-formulaire de dialog”, assurez-vous d’appeler ….
private void EnableAllWindows() { foreach (Form f in Application.OpenForms) f.Enabled = true; }
Pourquoi ne pas demander au parent d’attendre que l’enfant ferme? C’est plus que ce dont vous avez besoin.
// Execute child process System.Diagnostics.Process proc = System.Diagnostics.Process.Start("notepad.exe"); proc.WaitForExit();