2009-08-10 11 views
1

J'écris un programme qui fonctionne avec 2 formulaires, le formulaire principal et la forme où la configuration est faite, donc quand l'utilisateur clique sur tooltripmenu-> Preferences le formulaire Preferences est montré et je veux qu'il fasse l'utilisateur est seulement capable d'avoir un formulaire de préférences à la fois.Travailler avec des formulaires

Quand j'utilise:

Prefs preferencias = new Prefs; 

    private void preferenciasToolStripMenuItem_Click(object sender, EventArgs e) 
    { 
     preferencias.Show(); 
    } 

Il fonctionne, mais quand je ferme le formulaire Préférences et essayez d'ouvrir un nouveau le programme se bloque.

Et quand je l'utilise:

private void preferenciasToolStripMenuItem_Click(object sender, EventArgs e) 
    { 
     Prefs preferencias = new Prefs; 
     preferencias.Show(); 
    } 

L'utilisateur peut VHA plusieurs formulaire Préférences.

Que puis-je faire?

Merci d'avance.

Répondre

5

On dirait que vous voulez une boîte de dialogue modale, vous devez donc utiliser la méthode ShowDialog() au lieu de Show():

private void preferenciasToolStripMenuItem_Click(object sender, EventArgs e) 
{ 
    preferencias.ShowDialog(); 
} 
1
preferencias.ShowDialog() 

autorise uniquement l'ouverture d'une fenêtre de préférence.

0

Vous pouvez utiliser la propriété Application.OpenForms dans l'événement click de votre élément de menu pour vérifier si une forme de ce type est déjà ouverte. Si aucune forme de ce type n'est ouverte, vous pouvez ouvrir votre instance. S'il y en a, cela ne s'affichera tout simplement pas.

foreach (Form form in Application.OpenForms) { 
    if (form.GetType() != typeof(PreferencesForm)) { 
     new PreferencesForm().Show(); 
    } 
} 

Ou, comme déjà dit, vous pouvez appeler PreferencesForm.ShowDialog() pour rendre le formulaire modal, auquel cas l'utilisateur doit fermer la forme avant même de pouvoir interagir avec la principale forme à nouveau.

La méthode que vous utilisez dépend si vous voulez que l'utilisateur puisse utiliser le formulaire principal même si le formulaire de préférences est ouvert.

+0

Cela semble un peu en arrière, mais cela fonctionnera si vous ne voulez pas que la boîte de dialogue de préférences soit modale (cela semble pourtant être le choix évident) –

+0

Mise à jour de mon post avec un raisonnement derrière la première méthode. –

0

Si vous recherchez 1 et seulement 1, vous souhaitez probablement implémenter le Singleton pattern pour la classe Prefs.

+0

Je pense que c'est aller trop loin quand l'OP a simplement besoin d'un dialogue modal. –

2

Le ShowDialog() que d'autres ont suggéré est une bonne réponse. Si vous êtes intéressé par une alternative, voici quelque chose que je fais parfois:

private void FormClosing(object sender, FormClosingEventArgs e) 
{ 
    if (e.CloseReason == CloseReason.UserClosing) 
    { 
     e.Cancel = true; 
     Hide(); 
    } 
} 

Qu'est-ce que cela ne se cache tout simplement le formulaire afin que si vous le montrer à nouveau, son déjà chargé en mémoire. En outre, si vous avez une minuterie ou un autre thread dans cette forme en cours d'exécution, il peut toujours s'exécuter et faire son truc.

Questions connexes