2009-09-29 7 views
0

Je cette boucle:C# Comment atteindre un panneau créé pendant l'exécution du programme?

int iPanelNumber = 1; 

foreach (string[] Persons in alItems) 
{ 
    Panel pPanelContainer = new Panel(); 
    pPanelContainer.Width = contentPanel.Width; 
    pPanelContainer.Height = 50; 
    pPanelContainer.BackColor = Color.FromArgb(
     Convert.ToInt32(aWhiteContentBackgroundColors[0]), 
     Convert.ToInt32(aWhiteContentBackgroundColors[1]), 
     Convert.ToInt32(aWhiteContentBackgroundColors[2])); 

    pPanelContainer.Name = "PanelContainer" + iPanelNumber.ToString(); 
    pPanelContainer.Visible = false; 
    pPanelContainer.Location = new Point(0, 0); 
} 

Comme vous pouvez le voir, j'ai donné les panneaux que je crée le nom « PanelContainer1 », « PanelContainer2 » etc ...

Mais comment puis-je atteindre ces panneaux?

Je ne pourrais certainement pas les atteindre en écrivant:

PanelContainer1.visible = true; 

Quelqu'un at-il une idée?

Merci à l'avance

+1

BTW: vous n'incrémentez pas iPanelNumber dans votre boucle! Est-ce une erreur de copie/passé? – M4N

Répondre

2

plus simple est sans doute d'ajouter un champ List<Panel> à vos références de classe et stocker à tous les panneaux dans cette liste, par exemple:

class MyClass 
{ 
    private List<Panel> _panels = new List<Panel>(); 

    void MethodWhichCreatesThePanels() 
    { 
    //.. 
    foreach (string[] Persons in alItems) 
    { 
     Panel pPanelContainer = new Panel(); 
     _panels.Add(pPanelContainer); 
     ... 
    } 
    } 

Ensuite, vous pouvez accéder à chaque panneau en utilisant plus tard un index:

Panel aPanel = _panels[i]; 
+0

Très bien! Je vais essayer ça. Merci! – Ikky

0

La réponse de Martin est à peu près ce que vous cherchez, mais il semble que vous êtes dans la confusion sur ce que la propriété .Name y du contrôle de panneau fait.

Ce qu'il ne fait pas est de définir le nom de la variable.

Ce qu'il fait est le suivant (de MSDN: http://msdn.microsoft.com/en-us/library/system.windows.forms.control.name.aspx)

La propriété Name peut être utilisé au moment de l'exécution pour évaluer l'objet par son nom plutôt que le type et le nom programmatique. Parce que la propriété Name renvoie un type de chaîne, il peut être évalué dans des instructions de logique de style case (instruction Select dans Visual Basic, instruction switch dans Visual C# et Visual C++).

0

Vous ne pouvez pas référencer le Panel par son nom car il n'y a aucun champ dans le formulaire (ou variable locale) portant ce nom. Ces champs sont définis dans le fichier de classe partielle pour le Form que le Concepteur de formulaires génère; ils ne sont pas (et ne peuvent pas être) créés lors de l'exécution. Cela ne signifie pas que vous ne pouvez pas y accéder par son nom; vous ne pouvez pas y accéder en utilisant son nom comme nom de variable dans votre code.

La méthode la plus évidente consiste à ajouter le Panel à la collection Controls de son contrôle conteneur après l'avoir créé. Puisque vous avez défini Visible sur false, cela n'aura aucun effet visible sur votre formulaire. Donc, dans votre code, vous voulez ajouter quelque chose comme

contentPanel.Add(p); 

Vous pouvez ensuite référencer par nom:

contentPanel.Controls["PanelContainer1"].Visible = true; 

Si pour une raison quelconque, vous ne voulez pas ajouter à la collection encore Controls (il y a de nombreuses raisons pour lesquelles vous ne le pouvez pas), l'approche suivante consiste à créer une instance d'une classe de collection quelconque et à ajouter le Panel à cette collection. Puisque vous voulez être capable de le référencer par son nom, le choix le plus évident serait un dictionnaire, par ex.:

Dictionary<string, Panel> panels = new Dictionary<string, Panel>; 
... 
panels.Add(p.Name, p); 

Et encore, vous pouvez référencer par nom:

panels["PanelContainer1"].Visible = true; 

... mais dans ce cas, le Panel ne serait pas devenu réalité visible, parce que ce n'est pas dans la collection Controls d'un contrôle de conteneur visible. En aparté: si vous êtes en droit de le faire, vous devriez mettre un terme à l'utilisation des préfixes de type sur vos noms de variables. Il y a encore des magasins qui utilisent cette convention, mais elle a généralement été abandonnée par la communauté des programmeurs C#.

+0

ah, merci pour une bonne réponse. est-il plus commun d'utiliser simplement "_" avant le nom de variable? – Ikky

+0

Puisque l'EDI peut généralement vous dire de quel type est une variable, il n'est généralement pas utile d'incorporer le type dans son nom. C'est un petit morceau d'un très grand sujet: voir, par exemple, http://msdn.microsoft.com/en-us/library/xzf533w0(VS.71).aspx. –