2010-09-16 14 views
9

Mam kontrolkę Literal, którą próbuję zlokalizować, aby można było wstawić do niej tekst. Mam stronę wzorcową zawierającą kilka symboli zastępczych zawartości.Korzystanie z funkcji FindControl() w celu znalezienia kontroli

<asp:Content ID="Content7" ContentPlaceHolderID="MainLinks" runat="server"> 
    <h3>Project Navigation</h3> 
<ul class="rightColBoxNav"> 
<asp:Literal ID="litNavLinks" runat="server" /> 
</ul> 
</asp:Content> 

Otrzymuję "Odwołanie do obiektu nie jest ustawione na wystąpienie obiektu". Jak zlokalizować ten obiekt, aby go znaleźć i zaktualizować?

Próbowałem:

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

bezskutecznie. Jak określić lokalizację?

+1

Nie wypróbowałem tego, ale czy możesz użyć litNavLinks.Text = sb.ToString()? –

+0

Widząc to z odpowiedzią Darina. Będę musiał spróbować tego rano. Nie próbowałem tego i założę się, że to zadziała. Czuję się głupio, jeśli tak jest. Czuję się głupio myśląc, że to prawda. –

+0

Czasami to proste rzeczy, które nas wyprawiają. –

Odpowiedz

10

Od wewnątrz masterpage:

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

Od wewnątrz widzenia:

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

Tak jak powiedziałem powyżej. Teraz czuję się głupio. Może powinienem zasnąć w nocy ... –

1

chciałbym spróbować innego podejścia.

Jak korzystać z kontroli użytkownika i ujawniania odpowiednich właściwości, aby uzyskać lub ustawić wartość tekstu.

Właściwość będzie uzyskiwać dostęp do kontroli dosłownej. Jednak strona wywołująca właściwość nie będzie mądrzejsza.

Pamiętaj, że żyjemy w świecie OO.

1

Myślę, że trzeba to zrobić, ale nie mam mojego kodu dokładnie sprawdzić teraz:

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

ASP ContentPlaceHolder control jest „nazewnictwa pojemnik” (implementuje interfejs INamingContainer) . Control.FindControls method wyszukuje tylko w bieżącym kontenerze nazewnictwa dla formantu o podanym ID.

Od czasu do czasu dodawałem funkcję użyteczną, która akceptuje ciąg znakowy "/", aby dowolnie nawigować po kontenerach nazw na stronie. Coś jak poniższa implementacja. (Uwaga: Nie próbowałem skompilować lub przetestować ten kod)

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; 
    } 

Więc w twoim przypadku powinien być w stanie wykonać następujące czynności:

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

lub

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