2010-06-16 5 views
0
nommer

Cela devrait fonctionner .. Je pense ..modification des propriétés sur un contrôle en utilisant les contrôles

string ctrlName = "btnSomeButton" + someIndexValue; 
this.Controls[ctrlName].Text = "Some value"; 

je suis « objet référence non définie à une instance d'un objet. », Le contrôle existe sur la forme. J'ai essayé de le lancer.

Solution:

string ctrlName = "btnSomeButton" + someIndexValue; 
Control[] ctrl = this.Controls.Find(ctrlName, True); 
Button btn = (Button)ctrl[0]; 
btn.Text = "Some Value"; 

Merci.

+1

Test si ctrl [0] existe * et * est un bouton. – Humberto

Répondre

0

Le contrôle peut être un contrôle imbriqué de sorte que vous allez avoir à creuser plus profondément dans l'arbre de commande de « cette »

Voici un simple outil de recherche de contrôle récursif, je l'ai écrit sans le tester, mais je pense qu'il devrait travailler à vos besoins:

private Control FindControl(Control ctr, string name) 
{ 
    Control c = null; 
    for (int i = 0; i < ctr.Controls.Count; i++) 
    { 
     if (string.Equals(ctr.Controls[i].ID, name, StringComparison.CurrentCultureIgnoreCase)) 
     { 
      c = ctr.Controls[i]; 
      break; 
     } 
     if (ctr.Controls[i].Controls.Count > 0) 
     { 
      c = FindControl(ctr.Controls[i], name); 
      if (c != null) 
       break; 
     } 
    } 

    return c; 
} 
0

avez-vous vraiment un contrôle nommé comme ctrlName dans votre collection immédiateControls? C'est peut-être le nom d'un contrôle qui est plus profond dans la hiérarchie, ou même un contrôle qui n'existe pas.

Essayez de trouver le contrôle récursive:

string ctrlName = "btnSomeButton" + someIndexValue; 
Control[] matchingControls = this.Controls.Find(ctrlName, true); 
foreach (Control c in matchingControls) 
    c.Text = "Some value"; 
+0

D'accord, je vois ce que vous dites. Le contrôle (un bouton) est situé sur un contrôle de tabulation. Je peux voir comment cela peut être le problème. La seule chose est que ma forme (ou .this) n'a pas de méthode 'FindControl'. Pourquoi cela serait-il? – carny666

+1

Il n'y a qu'un FindControl dans les formulaires Web. Les formulaires de Win réguliers ne les ont pas. Vous pouvez utiliser this.Controls.Find (ctrlName, true); Le "vrai" signifie qu'il devrait également rechercher tous les contrôles enfants. Cela devrait trouver votre bouton. –

+0

GRAND ... merci monsieur. – carny666

0

-ce que vos boutons permettent de contrôler réellement sur la forme, ou ont-ils un autre parent? Par exemple, si vous les boutons résident à l'intérieur d'un Panel ou GroupBox vous ne serez pas en mesure d'y accéder par leur nom en utilisant simplement this. Vous devrez les trouver dans leur conteneur.

Exemple: myPanel.Controls[ctrlName].Text = "Some Value"

0

Vous pouvez utiliser les méthodes de contrôle en plus de ce ci-dessous pour déterminer où le contrôle est situé à savoir quel parent pourrait avoir ce contrôle attribué.

{ 
     Control[] ctls = this.Controls.Find("Button2", true); 
     if (ctls.Length > 0) 
     { 
      Button btn = ctls[0] as Button; 
      if (btn != null) 
       btn.PerformClick(); 
     } 
     else 
      MessageBox.Show("Not Found"); 
    } 

    private void button2_Click(object sender, EventArgs e) 
    { 
     MessageBox.Show("Button2 Clicked"); 
    } 
0

En fonction de vos besoins, vous voudrez peut-être envisager la création d'une collection Dictionary<string, Control> qui vous permet de vous reporter rapidement au contrôle par son nom. Cela vous évite également d'exiger le nom du contrôle contenant l'index.

Questions connexes