2010-11-28 4 views
1

Je travaille dans l'application de formulaires C# windows dans laquelle j'ajoute 3 contrôles différents ayant le même nom (un bouton, un textBox & un Label) à mon formulaire.Ajout de différents contrôles ayant les mêmes noms en C# Windows Form

Pourquoi il y a une erreur dans button4_Click?

CODE:

private void button1_Click(object sender, EventArgs e) 
{ 
     TextBox myControl = new TextBox(); 
     myControl.Name = "myControl"; 
     this.Controls.Add(myControl); 
} 

private void button2_Click(object sender, EventArgs e) 
{ 
     Button myControl = new Button(); 
     myControl.Name = "myControl"; 
     this.Controls.Add(myControl); 
} 

private void button3_Click(object sender, EventArgs e) 
{ 
     Label myControl = new Label(); 
     myControl.Name = "myControl"; 
     this.Controls.Add(myControl); 
} 

private void button4_Click(object sender, EventArgs e) 
{ 
     ((ComboBox)this.Controls["myControl"]).Text = "myCombo"; // works 
     ((TextBox)this.Controls["myControl"]).Text = "myText"; // error 
     ((Label)this.Controls["myControl"]).Text = "myLabel"; // error 
} 
+1

Vous devriez nommer vos boutons. – SLaks

Répondre

2

L'indexeur Controls [chaîne] renvoie le premier contrôle dont le nom correspond à la chaîne. Il va être aléatoire avec votre code, mais vous avez probablement un ComboBox déjà ajouté au formulaire avec le même nom. Les instructions suivantes vont kaboom car vous ne pouvez pas convertir un ComboBox en TextBox.

Bien sûr, essayez de faire le truc sain, donnez à ces contrôles des noms différents.

+0

Je veux savoir que tous ces éléments sont ajoutés pour former avec le même nom. Comment? –

+1

Erm, juste itérer Contrôle et compte ceux avec ce nom? Quel est le point de cela? –

0

this.Controls["myControl"] renvoie le premier contrôle nommé myControl.

Ceci est un TextBox, pas un label. Au lieu d'y accéder par le biais de la collection Controls, vous devez stocker vos contrôles dans les champs de la classe de formulaire (en utilisant éventuellement List<T> s).

0

Voici une idée qui pourrait vous aider:

void SetControlText(Type controlType, string controlName, string text) { 
     foreach (var ctl in this.Controls.OfType<Control>()) { 
     if (ctl.GetType() == controlType && ctl.Name == controlName) { 
      ctl.Text = text; 

      break; 
     } 
     } 
    } 

Ou avec LINQ seulement:

var item = this.Controls.OfType<Control>().Where(j => j.GetType() == controlType && j.Name == controlName).FirstOrDefault(); 
     if (item != null) 
     item.Text = text; 

Il suffit d'appeler la fonction ci-dessus comme ceci:

SetControlText(typeof(Button), "myButton", "Text was set!"); 

Cette fonction parcourez tous les contrôles du formulaire et quand il trouve le type de contrôle que vous spécifiez avec le nom e vous spécifiez, il mettra à jour les contrôles. Champ texte.

Questions connexes