2008-10-22 5 views
3

J'ai un contrôle composite qui ajoute un contrôle TextBox et un contrôle Label à sa collection Controls. Lorsque je tente de mettre AssociatedControlID l'étiquette au ClientID de la zone de texte que je reçois cette erreurLa définition de AssociatedControlID sur l'étiquette échoue

Unable to find control with id 
'ctl00_MainContentPlaceholder_MatrixSetControl_mec50_tb' 
that is associated with the Label 'lb'. 

Ok, donc un peu de fond. J'ai obtenu ce contrôle composite principal qui ajoute dynamiquement un certain nombre d '«éléments» à sa collection de contrôle. Un de ces éléments se trouve être ce 'MatrixTextBox' qui est le contrôle consistant en un TextBox et un Label.

Je détiens le label et TextBox comme variables de classe protégées et les init CreateChildControls:

ElementTextBox = new TextBox(); 
    ElementTextBox.ID = "tb"; 
    Controls.Add(ElementTextBox); 

    ElementLabel = new Label(); 
    ElementLabel.ID = "lb"; 
    Controls.Add(ElementLabel); 

J'essayé de placer le

ElementLabel.AssociatedControlID = ElementTextBox.ClientID; 

à la fois juste après avoir ajouté les contrôles à la collection Controls et même dans PreRender - les deux produisent la même erreur. Qu'est-ce que je fais mal?

Répondre

7

Je pense que vous ne devez pas utiliser la propriété ClientID du ElementTextBox, mais le ID. ClientID est l'identifiant unique à la page que vous devez utiliser dans Javascript, par ex. dans le document.getElementyById et n'est pas le même que l'ID côté serveur - surtout si vous avez un masterpage et/ou des contrôles dans les contrôles, etc.

Il doit donc être:

ElementLabel.AssociatedControlID = ElementTextBox.ID; 

Hope this helps .

+0

Merci! Merde, je me sens stupide maintenant :) –

+0

@Hojou: oh, ... des erreurs similaires m'arrivent tout le temps. C'est tellement clair si vous voyez la solution ... – splattne

+0

Excellente trouvaille. –

3

Peut-être utile à d'autres lecteurs qui rencontrent l'erreur:

Notez que la mise en AssociatedControlID échoue aussi si vous associer l'étiquette avec un contrôle d'entrée lors de l'exécution sans définir explicitement l'ID du contrôle d'entrée en premier. C'est un problème qui nécessite une attention particulière si vous créez plusieurs zones de texte, cases à cocher ou radiobuttions avec des étiquettes de façon dynamique.

private void AddRadioButton(PlaceHolder placeholder, string groupname, string text) 
{ 
    RadioButton radio = new RadioButton(); 
    radio.GroupName = groupname; 
    radio.ID = Guid.NewGuid().ToString(); // Always set an ID. 

    Label label = new Label(); 
    label.Text = text; 
    label.AssociatedControlID = radio.ID; 

    placeholder.Controls.Add(radio); 
    placeholder.Controls.Add(label); 
} 
+0

Merci! C'était exactement le problème auquel je faisais face. – Nurp

Questions connexes