web-dev-qa-db-fra.com

Comment désactiver le formulaire parent lorsqu'un formulaire enfant est actif?

Comment désactiver un formulaire parent lorsque le formulaire enfant est actif à l'aide de c #?

68
vany

Avez-vous essayé d'utiliser Form.ShowDialog () au lieu de Form.Show () ?

ShowDialog affiche votre fenêtre comme modale, ce qui signifie que vous ne pouvez pas interagir avec le formulaire parent tant qu'il n'est pas fermé.

179

Appelez-vous ShowDialog() ou juste Show() sur votre formulaire enfant à partir du formulaire parent?

ShowDialog "empêchera" l'utilisateur d'interagir avec le formulaire passé en paramètre à ShowDialog.

Dans le parent, vous pouvez appeler quelque chose comme:

MyChildForm childForm = new MyChildForm();

childForm.ShowDialog(this);

this est le formulaire parent.

37
Philip

C'est simple, utiliser 

  Form.ShowDialog();

Au lieu

  Form.Show();

Lorsque vous utilisez Form.ShowDialog(), vous ne pouvez pas interagir avec le formulaire parent tant qu'il n'est pas fermé.

15
Rizwan Ansari

Ce que vous pouvez faites, vous devez 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 les 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 entraînera un comportement vraiment étrange; Bien que vous ne puissiez pas revenir en arrière et interagir avec le formulaire parent immédiatement, l'activation de toute autre application l'activera, ce qui permettra à l'utilisateur d'interagir avec celui-ci.

Si vous voulez que le formulaire enfant modal , utilisez ShowDialog à la place:

  Form newForm = new ChildForm();
  newForm.ShowDialog(this);
9
Fredrik Mörk

Si vous utilisez le formulaire childForm.ShowDialog mentionné précédemment (this) désactivera votre formulaire principal, il a toujours l’air très désactivé. Toutefois, si vous appelez Enabled = false avant ShowDialog () et Enable = true après avoir appelé ShowDialog (), le formulaire principal aura même l'air d'être désactivé.

var childForm = new Form();
Enabled = false;
childForm .ShowDialog(this);
Enabled = true;
7
helgeheldre
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-20bd34f0e55/how-can-i-en-en-en-child bloquer-la-fenêtre-parent-seulement

6
stack
Form1 frmnew = new Form1();
frmnew.ShowDialog();
4
sk2185

@ Melodia 

Désolé, ce n’est pas du code C #, mais c’est ce que vous voudriez; outre le fait 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

4
Don Thomas Boyle

Vous pouvez le faire avec les éléments suivants:

Form3 formshow = new Form3();

formshow.ShowDialog();
3
Manish sharma

Vous pouvez également utiliser le formulaire MDIParent-child. Définissez le parent du formulaire enfant en tant que parent MDI

Par exemple

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

Dans ce cas, un seul formulaire sera affiché et les formulaires enfants entreront dans le parent . J'espère que cela vous aidera

2
Nisha

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);
1
user3856440

Si vous essayez simplement de simuler un appel Form.ShowDialog mais SANS rien bloquer (un peu comme un formulaire de dialogue simulé), vous pouvez utiliser Form.Show () et dès que vous affichez le formulaire de dialogue simulé, désactivez immédiatement toutes les autres 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 "formulaire de pseudo-dialogue", assurez-vous d'appeler ....

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