2010-09-16 39 views
9

Tôi có một điều khiển Literal mà tôi đang cố định vị trí để tôi có thể chèn văn bản vào đó. Tôi có một trang Master có chứa một số phần giữ chỗ nội dung.Sử dụng FindControl() để tìm điều khiển

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

Tôi tiếp tục nhận được "Tham chiếu đối tượng không được đặt thành thể hiện của đối tượng". Làm thế nào để xác định vị trí đối tượng này để tôi có thể tìm và cập nhật nó?

Tôi đã thử:

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

vô ích. Làm cách nào để xác định vị trí?

+1

Chưa thử, nhưng bạn có thể sử dụng litNavLinks.Text = sb.ToString() không? –

+0

Thấy điều đó với câu trả lời của Darin. Tôi sẽ phải thử nó vào buổi sáng. Tôi đã không thử nó và tôi đặt cược nó sẽ làm việc. Tôi cảm thấy ngu ngốc nếu đó là trường hợp. Tôi cảm thấy ngu ngốc bây giờ nghĩ rằng đó là đúng. –

+0

Đôi khi đó là những thứ đơn giản mà chúng tôi đi lên. –

Trả lời

10

Từ bên trong masterpage:

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

Từ trong giao diện:

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

Như tôi đã nói ở trên. Bây giờ tôi cảm thấy ngu ngốc. Có lẽ tôi nên ngủ nhiều hơn vào ban đêm ... –

1

tôi sẽ cố gắng một cách tiếp cận khác nhau.

Cách sử dụng điều khiển người dùng và hiển thị các thuộc tính có liên quan để nhận hoặc đặt giá trị văn bản.

Thuộc tính sẽ truy cập vào kiểm soát theo nghĩa đen. Tuy nhiên, trang gọi là tài sản sẽ không được khôn ngoan hơn.

Hãy nhớ rằng chúng ta đang sống trong thế giới OO.

1

Tôi nghĩ rằng bạn phải làm điều này, nhưng tôi không có mã của tôi để kiểm tra lại ngay bây giờ:

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

Các ASP ContentPlaceHolder control là một "đặt tên container" (nó thực hiện các giao diện INamingContainer) . Chỉ Control.FindControls method tìm kiếm trong vùng chứa đặt tên hiện tại để kiểm soát bằng ID mà bạn chỉ định.

Tôi đã thường xuyên đưa vào một chức năng tiện ích chấp nhận chuỗi ký tự "/" để tùy ý điều hướng qua các vùng chứa đặt tên trên trang. Một cái gì đó giống như việc thực hiện sau đây. (Lưu ý: Tôi đã không cố gắng để biên dịch hoặc kiểm tra mã này)

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

Vì vậy, trong trường hợp của bạn, bạn sẽ có thể làm như sau:

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

hoặc

Page.FindControlByPath("MainLinks/litNavLinks").Text = sb.ToString(); 
-1
Literal tbx = this.Controls.Find("Literal1", true).FirstOrDefault() as Literal; 
Các vấn đề liên quan