2010-09-16 4 views
9

J'ai un contrôle Literal que j'essaie de localiser pour y insérer du texte. J'ai une page maître qui contient plusieurs espaces réservés de contenu. Je continue à obtenir "La référence d'objet n'est pas définie sur une instance d'un objet." Comment puis-je localiser cet objet pour que je puisse le trouver et le mettre à jour?Utilisation de FindControl() pour trouver le contrôle

J'ai essayé:

((Literal)Page.FindControl("litNavLinks")).Text = sb.ToString(); 
((Literal)Page.Page.FindControl("litNavLinks")).Text = sb.ToString(); 
((Literal)Page.FindControl("Content7").FindControl("litNavLinks")).Text = sb.ToString(); 

en vain. Comment puis-je déterminer l'emplacement?

+1

N'avez pas essayé, mais pouvez-vous utiliser litNavLinks.Text = sb.ToString()? –

+0

Voyant cela avec la réponse de Darin. Je vais devoir l'essayer le matin. Je n'ai pas essayé et je parie que ça marchera. Je me sens stupide si c'est le cas. Je me sens stupide en pensant que c'est juste. –

+0

Parfois, ce sont les choses simples qui nous font voyager. –

Répondre

10

À partir de l'masterpage:

var literal = (Literal)FindControl("MainLinks").FindControl("litNavLinks"); 
literal.Text = sb.ToString(); 

A partir de la vue:

litNavLinks.Text = sb.ToString(); 
+0

Comme je l'ai dit ci-dessus. Je me sens stupide maintenant. Peut-être devrais-je dormir davantage la nuit ... –

1

Je voudrais essayer une approche différente. Comment utiliser un contrôle utilisateur et exposer les propriétés pertinentes pour obtenir ou définir la valeur du texte.

La propriété accèderait au contrôle littéral. Cependant, la page appelant la propriété ne serait pas plus sage. Rappelez-vous que nous vivons dans un monde OO.

1

Je pense que vous avez à faire, mais je n'ai pas mon code à revérifier en ce moment:

Page.Master.FindControl("MainLinks").FindControl("litNavLinks"); 
1

L'ASP ContentPlaceHolder control est un « conteneur nommant » (il implémente l'interface INamingContainer) . Le Control.FindControls method recherche uniquement dans le conteneur de dénomination actuel pour un contrôle avec l'ID que vous spécifiez.

J'ai parfois inclus une fonction d'utilité qui accepte une chaîne délimitée "/" pour naviguer arbitrairement à travers les conteneurs de dénomination sur une page. Quelque chose comme l'implémentation suivante. (Note: Je ne l'ai pas essayé de compiler ou tester ce code)

public static Control FindControlByPath(this Control start, string controlPath) 
    { 
     if(controlPath == null) 
      throw new ArgumentNullException("controlPath"); 

     string[] controlIds = controlPath.split('/'); 

     Control current = start; 
     if(controlIds[0] == "") // in case the control path starts with "/" 
      current = start.Page; // in that case, start at the top 

     for(int i=0; i<controlIds.Length; i++) 
     { 
      switch(controlIds[i]) 
      { 
       case "": 
        // TODO: handle syntax such as "<controlId>//<controlId>", if desired 
        break; 

       case ".": 
        // do nothing, stay on the current control 
        break; 

       case "..": 
        // navigate up to the next naming container 
        current = current.Parent; 
        if(current == null) 
         throw new ArgumentOutOfRangeException("No parent naming container exists.", "controlPath"); 

        while(!(current is INamingContainer)) 
        { 
         current = current.Parent; 
         if(current == null) 
          throw new ArgumentOutOfRangeException("No parent naming container exists.", "controlPath"); 
        }      
        break; 

       default: 
        current = current.FindControl(controlIds[i]); 
        break; 
      } 
     } 

     return current; 
    } 

Donc, dans votre cas, vous devriez être en mesure de faire ce qui suit:

<some control>.FindControlByPath("/MainLinks/litNavLinks").Text = sb.ToString(); 

ou

Page.FindControlByPath("MainLinks/litNavLinks").Text = sb.ToString(); 
-1
Literal tbx = this.Controls.Find("Literal1", true).FirstOrDefault() as Literal; 
Questions connexes