2009-02-23 7 views
2

Je travaille sur un projet Winforms en C# et j'ai un contrôle utilisateur qui est chargé lors de sa sélection à partir d'un menu déroulant. J'ai un ensemble de recherche de dictionnaire pour se produire lors du chargement du contrôle utilisateur pour d'autres fonctionnalités. En outre, lorsque je ferme le contrôle utilisateur, j'utilise simplement ".Hide();" méthode. J'ai remarqué que lorsque je charge le contrôle de l'utilisateur la première fois tout va bien, mais quand je le ferme et que je choisis de l'ouvrir à nouveau la deuxième fois, il crée une nouvelle instance de l'objet rejetant ainsi ma recherche de dictionnaire. Par conséquent, j'ai écrit du code pour tenter de résoudre le problème.Contrôles utilisateur créés dynamiquement en C#

Ce que je dois faire est de dire que si une instance du contrôle utilisateur existe déjà, ne créez pas une nouvelle instance de cet objet. Au lieu de cela, il suffit de rendre le contrôle utilisateur visible à nouveau. Par conséquent j'ai écrit le code dans une tentative d'accomplir ce but. Quand je sélectionne l'article la première fois, tout va bien. Lorsque je cache le contrôle utilisateur et que j'essaie de le rouvrir, rien ne se passe.

Voici le code que je l'ai écrit à cet effet qui se produit lors de la sélection de l'élément dans le menu outil bande:

 if (Controls.ContainsKey("CheckAvailUserControl")) 
     { 
      Controls["CheckAvailUserControl"].Dock = DockStyle.Fill; 
      Controls["CheckAvailUserControl"].Visible = true; 
      Controls["CheckAvailUserControl"].Show(); 
      Controls["CheckAvailUserControl"].Refresh(); 
     } 

     else 
     { 
      UserControl checkAvailUserControlLoad = new CheckAvailUserControl(); 
      Controls.Add(checkAvailUserControlLoad); 
      checkAvailUserControlLoad.Dock = DockStyle.Fill; 
      checkAvailUserControlLoad.Visible = true; 
      checkAvailUserControlLoad.Show(); 
     } 

Quand je trace à travers mon code dans le débogueur, il est en fait frapper les bonnes parties de l'instruction if/else ci-dessus. C'est juste ne pas afficher le contrôle de l'utilisateur sur l'écran la 2ème fois que je tente de le charger.

La question est: Comment charger le contrôle utilisateur après le fermer, puis le sélectionner à nouveau dans le menu de la barre d'outils?

+0

Quelle est la question? –

+0

La question est: Comment puis-je charger correctement le contrôle utilisateur après l'avoir fermé, puis le sélectionner à nouveau dans le menu de la barre d'outils? –

Répondre

9

Je pense que Controls.ContainsKey (...) renvoie toujours false, car vous n'avez jamais attribué de nom à votre contrôle lorsque vous l'avez créé.

Si, lorsque vous créez le contrôle, vous dites

//... 
checkAvailUserControlLoad.Name = "Something" 
//... 
Controls.Add(checkAvailUserControlLoad); 

puis

Controls.ContainsKey("Something") 

retourne vrai, et vous serez en mesure de réutiliser le contrôle en utilisant Controls["Something"]

+0

Oui, sauf si le code définissant la propriété Name est omis. –

+0

@Henk: N'est-ce pas le but de mon article, que vous devez définir la propriété Name? –

1

Cela pourrait fonctionner, mais je pense que c'est un peu en arrière: vous jetez un nouveau code à un problème qui pourrait être résolu à la place en déplaçant votre ancien code.

Au lieu de cela, pensez à la façon dont les événements fonctionnent dans votre formulaire. Je parie que si vous déplacez votre code de création à un événement légèrement différent, ou détectez quand l'événement est tiré plus tard et ignorez ceux-ci, vous pouvez résoudre le problème d'une manière beaucoup plus agréable.

2

vous allez ici:

private void button_Click(object sender, EventArgs e) 
{ 
    // pass in the containing panel 
    LoadControl<MyControls.MyControl>(panelContainer); 
} 

void LoadControl<T>(Panel panel) where T : Control, new() 
{ 
    T _Control = GetControl<T>(panel); 
    if (_Control == null) 
    { 
     _Control = new T(); 
     _Control.Dock = DockStyle.Fill; 
     panel.Controls.Add(_Control); 
    } 
    _Control.BringToFront(); 
} 

T GetControl<T>(Panel panel) where T : Control 
{ 
    Type _Type = typeof(T); 
    String _Name = _Type.ToString(); 
    if (!panel.Controls.ContainsKey(_Name)) 
     return null; 
    T _Control = panel.Controls[_Name] as T; 
    return _Control; 
} 
Questions connexes