2010-08-05 4 views
1

J'ai du code qui crée quelques composants sur le clic d'un bouton. Quelque chose comme ça.C# Comment référencer un composant créé dynamiquement?

CheckBox chk = new CheckBox(); 
chk.Top = 50; 
chk.Left = 50; 
chk.Text = "Check Box Test"; 
chk.Name = "chkTest" 
this.Controls.Add(chk); 

Alors comment utiliser ce composant. Par exemple j'ai essayé mais j'ai eu une erreur et j'ai dit que le composant n'existait pas. Je veux juste avoir leurs valeurs.

if(chkTest.Checked) 
{ 
//Do this 
} 

Aidez-nous s'il vous plaît.

Merci dans adv.

+0

D'où vient la variable chkTest? Vous pouvez définitivement le récupérer (le contrôle créé dynamiquement) à partir de la collection Controls, puis le convertir en CheckBox pour accéder à ses propriétés. –

+0

Bien sûr, vous ne pouvez pas faire cela. Un contrôle n'apparaît pas par magie en tant que membre d'un formulaire (ou quelle que soit la classe à partir de laquelle vous l'utilisez). Vous devez utiliser une variable d'espace réservé 'Form1 {... private ComboBox chkTest; ...} 'ou comme ** Dave ** a suggéré de l'extraire de la collection' Controls' en dehors de la portée de la variable 'chk'. –

Répondre

3

Soit créer une variable membre dans votre classe appelée chkTest que vous pouvez utiliser plus tard, ou le récupérer à la volée de la collection de contrôles en cas de besoin, comme ceci:

CheckBox chkTest = (CheckBox)Controls["chkTest"]; 
if(chkTest.Checked) { 
    // ... 
} 
+0

Utilisez 'CheckBox chkTest = Controls [" chkTest "] comme CheckBox;' - il n'y a pas de conversion implicite de 'Control' à' CheckBox'. –

+0

A travaillé parfait. Merci. –

+0

@Jaroslav Jandek merci, j'ai mis à jour le poste pour cela. En outre, puisque nous nous attendons à ce qu'il s'agisse d'un CheckBox, il n'est pas nécessaire d'utiliser l'opérateur as - un cast direct suffira. – siride

0

Vous référencez chkTest mais vous avez créé chk.

+0

Peu importe le nom que je l'appelle. J'ai mis chkTest parce que c'est ce que le nom a donné. –

+0

@Ash - où déclarez-vous et attribuez-vous une valeur à la variable chkTest? – TrueWill

0

Vous pouvez déclarer la case à cocher en tant que variable membre de votre page. Ensuite, vous seriez en mesure d'y accéder plus facilement.

Classe MyPage { CheckBox chkTest;

// alors dans le chargement de la page // chkTest = new CheckBox(); ...

}

+0

Faire cela c'est la mémoire qui est ce que j'essaie d'éviter. –

+0

@Ash Burlaczenko: c'est une micro-optimisation qui ne vous économisera pas vraiment et qui vous permettra en fait d'utiliser plus de mémoire et de temps processeur pour trouver le contrôle de la collection. – siride

+0

Comment pensez-vous que cela économise de la mémoire? –

0
if ((Controls.Items["chkTest"] as CheckBox).Checked) 
{ 
// Do this 
} 

devrait fonctionner, mais ce n'est pas joli à regarder. :)

Vous pouvez le déclarer comme une variable, utilisez-le comme vous l'avez fait:

CheckBox chkTest = Controls.Items["chkTest"] as Checkbox; 
if (chkTest.Checked) 
{ 
// Do this 
} 

Regardez sur cette page à portée de main des façons de manipuler et d'accéder à la collection de votre commande d'articles: http://msdn.microsoft.com/en-us/library/system.windows.forms.control.controlcollection_members.aspx

+0

Vous devez vous assurer que chkTest n'est pas nul avant de l'utiliser lorsque vous utilisez l'opérateur as. –

1

Si vous ne tenez compte du contrôle que lorsqu'il est coché ou décoché, utilisez un événement. Assurez-vous de vous désabonner des gestionnaires d'événements lorsque vous en avez terminé avec eux.

Questions connexes