2010-09-16 12 views
9

Ich habe eine Literal Kontrolle, die ich versuche zu finden, damit ich Text einfügen kann. Ich habe eine Masterseite, die mehrere Inhaltsplatzhalter enthält.Verwenden von FindControl(), um das Steuerelement zu finden

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

Ich bekomme immer "Objektreferenz nicht auf eine Instanz eines Objekts festgelegt." Wie finde ich dieses Objekt, damit ich es finden und aktualisieren kann?

Ich habe versucht:

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

ohne Erfolg. Wie ermittle ich den Standort?

+1

Haben Sie es nicht versucht, aber können Sie litNavLinks.Text = sb.ToString() verwenden? –

+0

Das mit Darins Antwort sehen. Ich werde es morgens versuchen müssen. Ich habe es nicht versucht und ich wette, es wird funktionieren. Ich fühle mich dumm, wenn das der Fall ist. Ich fühle mich dumm, jetzt denke ich, dass das richtig ist. –

+0

Manchmal sind es die einfachen Dinge, die uns stolpern. –

Antwort

10

Aus dem Masterpage:

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

aus der Ansicht:

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

Wie ich oben sagte. Ich fühle mich jetzt dumm. Vielleicht sollte ich nachts mehr schlafen ... –

1

Ich würde einen anderen Ansatz versuchen.

Wie wäre es mit einem Benutzersteuerelement und dem Freilegen der relevanten Eigenschaften, um den Textwert zu erhalten oder festzulegen.

Die Eigenschaft würde auf das Literal-Steuerelement zugreifen. Die Seite, die die Eigenschaft aufruft, wäre jedoch nicht klüger.

Denken Sie daran, wir leben in einer OO-Welt.

1

Ich glaube, Sie, dies zu tun haben, aber ich meinen Code jetzt nicht nochmals zu überprüfen habe:

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

Die ASP ContentPlaceHolder control ist ein „Namenscontainer“ (es implementiert die INamingContainer-Schnittstelle) . Control.FindControls method sucht nur innerhalb des aktuellen Namenscontainers nach einem Steuerelement mit der von Ihnen angegebenen ID.

Ich habe gelegentlich eine Dienstprogrammfunktion hinzugefügt, die eine Zeichenfolge mit dem Zeichen "/" akzeptiert, um beliebig durch die Benennungscontainer auf einer Seite zu navigieren. So etwas wie die folgende Implementierung. (Anmerkung: Ich habe nicht versucht, diesen Code zu kompilieren oder testen)

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

in Ihrem Fall also sollten Sie in der Lage sein, Folgendes zu tun:

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

oder

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