2009-06-29 33 views
6

Ngày tốt lành mọi người,Truy cập điều khiển nội dung trong C# khi sử dụng Trang chính

Tôi đang tạo trang trong ASP.NET và sử dụng Trang chính trong quy trình.

Tôi có tên Chủ sở hữu địa điểm "cphBody" trong Trang chính của tôi, sẽ chứa nội dung của mỗi Trang mà Trang chính đó là Trang chính.

Trong trang Web ASP.NET, tôi có thẻ nội dung (tham chiếu "cphBody") cũng chứa một số điều khiển (nút, điều khiển Infragistics, vv) và tôi muốn truy cập các điều khiển này trong tệp CodeBehind. Tuy nhiên, tôi không thể làm điều đó trực tiếp (this.myControl ...), vì chúng được lồng trong thẻ Nội dung.

Tôi đã tìm thấy giải pháp thay thế bằng phương thức FindControl.

ContentPlaceHolder contentPlaceHolder = (ContentPlaceHolder) Master.FindControl("cphBody"); 
ControlType myControl = (ControlType) contentPlaceHolder.FindControl("ControlName"); 

Điều đó chỉ hoạt động tốt. Tuy nhiên, tôi nghi ngờ rằng nó không phải là một thiết kế rất tốt. Các bạn có biết cách thanh lịch hơn không?

Cảm ơn bạn!

Guillaume Gervais.

+1

bạn đang cố gắng truy cập vào các điều khiển từ codebehind trang nội dung, hoặc mã trang thạc sĩ phía sau? – wulimaster

+0

CodeBehind của trang Nội dung. –

+0

Thật lạ lùng. Bạn sẽ có thể truy cập trực tiếp vào các điều khiển từ mã của trang nội dung, trừ khi chúng được tạo và thêm tự động. –

Trả lời

4

Rick Strahl có một lời giải thích tốt (và mẫu mã) ở đây - http://www.west-wind.com/Weblog/posts/5127.aspx

+0

Cảm ơn bạn! Đó là cơ bản những gì tôi đã làm, vì vậy nó xác nhận phương pháp của tôi cho tôi! –

+0

Tôi thực sự không thích FindControl thông thường chỉ cần khi bạn không thể vạch trần một thuộc tính được đánh máy mạnh và bạn cần phải đào sâu qua đầu ra được hiển thị trước. – CRice

1

tôi sử dụng mã này cho acess để file đệ quy:

/// <summary> 
    /// Recursively iterate through the controls collection to find the child controls of the given control 
    /// including controls inside child controls. Return all the IDs of controls of the given type 
    /// </summary> 
    /// <param name="control"></param> 
    /// <param name="controlType"></param> 
    /// <returns></returns> 
    public static List<string> GetChildControlsId(Control control, Type controlType) 
    { 
     List<string> FoundControlsIds = new List<string>(); 
     GetChildControlsIdRecursive(FoundControlsIds, control, controlType); 

     // return the result as a generic list of Controls 
     return FoundControlsIds; 
    } 

    public static List<string> GetChildControlsIdRecursive(List<string> foundControlsIds, Control control, Type controlType) 
    { 
     foreach (Control c in control.Controls) 
     { 
      if (controlType == null || controlType.IsAssignableFrom(c.GetType())) 
      { 
       // check if the control is already in the collection 
       String FoundControl = foundControlsIds.Find(delegate(string ctrlId) { return ctrlId == c.ID; }); 

       if (String.IsNullOrEmpty(FoundControl)) 
       { 
        // add this control and all its nested controls 
        foundControlsIds.Add(c.ID); 
       } 
      } 

      if (c.HasControls()) 
      { 
       GetChildControlsIdRecursive(foundControlsIds, c, controlType); 
      } 
     } 
7

tôi cố gắng và tránh FindControl trừ khi không có thay thế, và thường có một cách neater.

Làm thế nào về bao gồm đường dẫn đến trang chủ của bạn ở phía trên cùng của trang trẻ

<%@ MasterType VirtualPath="~/MasterPages/PublicUI.Master" %> 

nào sẽ cho phép bạn trực tiếp gọi mã từ mã trang chủ của bạn đằng sau.

Sau đó từ mã trang chủ của bạn đằng sau bạn có thể làm cho một tài sản trở lại kiểm soát của bạn, hoặc thực hiện một phương pháp trên trang chủ có được sự kiểm soát của bạn, vv

public Label SomethingLabel 
{ 
    get { return lblSomething; } 
} 
//or 
public string SomethingText 
{ 
    get { return lblSomething.Text; } 
    set { lblSomething.Text = value; } 
} 

Đề cập đến một nhãn trên trang chủ

<asp:Label ID="lblSomething" runat="server" /> 

Cách sử dụng:

Master.SomethingLabel.Text = "some text"; 
//or 
Master.SomethingText = "some text"; 
+0

Còn cách khác thì sao? Tôi có một 'GridView' trong trang nội dung của tôi và tôi muốn có thể cập nhật từ MasterPage của tôi. – Si8

+0

Tôi sẽ nêu một sự kiện với dữ liệu sự kiện bạn cần từ trang chính và đăng ký với trang của bạn. Master.SomeEvent + = SomeHandler; – CRice

3

không có gì để làm khác nhau. Chỉ cần viết mã này trên trang con để truy cập điều khiển nhãn trang chính.

Label lblMessage = new Label(); 
lblMessage = (Label)Master.FindControl("lblTest"); 
lblMessage.Text = DropDownList1.SelectedItem.Text; 
1

Hi chỉ nghĩ rằng tôi muốn chia sẻ giải pháp của tôi, tìm thấy công trình này để truy cập vào một 'kiểm soát' có nghĩa là bên trong một < asp: Panel> mà là trên một 'ContentPage', nhưng từ C# code-behind của 'MasterPage'. Hy vọng nó sẽ giúp một số.

  1. thêm một < asp: Panel> với ID = "PanelWithLabel" và runat = "server" để ContentPage của bạn.

  2. bên trong Bảng điều khiển, thêm nhãn < asp: Label> có ID = "MyLabel".

  3. viết (hoặc sao chép/dán bên dưới) một hàm trong mã MasterPage của bạn như sau: (điều này kiểm soát nhãn, bên trong bảng điều khiển, cả hai trên ContentPage, từ mã trang chính phía sau và những thay đổi văn bản của nó là của một TextBox trên trang Thạc sĩ :)

    protected void onButton1_click(object sender, EventArgs e) 
    { 
    // find a Panel on Content Page and access its controls (Labels, TextBoxes, etc.) from my master page code behind // 
    System.Web.UI.WebControls.Panel pnl1; 
    pnl1 = (System.Web.UI.WebControls.Panel)MainContent.FindControl("PanelWithLabel"); 
    if (pnl1 != null) 
    { 
        System.Web.UI.WebControls.Label lbl = (System.Web.UI.WebControls.Label)pnl1.FindControl("MyLabel"); 
        lbl.Text = MyMasterPageTextBox.Text; 
    } 
    } 
    
Các vấn đề liên quan