2016-02-05 62 views
2

我有一個頁面:Abc.aspx如何從用戶控件的母版頁內的內容頁找到標籤控件?

在我用一個母版頁是Master1.MasterAbc.aspx頁。

現在,在這個母版頁上,我提交了1個用戶控件名稱Usercontrol1.ascx。

在此用戶控件上,我把1個標籤命名爲lbl1。

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

所以現在Abc.aspx頁的頁面加載事件,我想找到這個控制和我都試過,但得到空:

protected void Page_Load(object sender, EventArgs e) 
     { 
      var lbl = ((Label)this.Master.FindControl("lbl1")); // null here 
      ((Label)this.Page.Master.FindControl("lbl1")).Text = "Hello"; //error here:object reference not set to instance of object 
     } 

這是我的母版頁:

<%@ Master Language="C#" AutoEventWireup="true" CodeBehind="Master1.Master.cs" Inherits="" %> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head id="Head1" runat="server"> 
<asp:ContentPlaceHolder ID="head" runat="server"></asp:ContentPlaceHolder> 
</head> 

<body> 
    <form runat="server"> 
    <div id="Load"> 
        <uc2:UserControl1 ID="UserControl1 " runat="server" /> 
        <asp:ContentPlaceHolder ID="cphMain" runat="server"> 
        </asp:ContentPlaceHolder> 
       </div> 
</form> 
</body> 
</html> 
+1

最好的辦法是在提供一個屬性的帶有有意義名稱的'MasterPage'和'string'類型。該屬性獲取/設置'UserControl'中的標籤文本。爲了達到這個目的,還要在'UserControl'中提供一個具有相同有意義名稱和類型'string'的屬性。該屬性獲取/設置標籤的文本。您必須將'this.Master'強制轉換爲'Master1'的'MasterPage'的實際類型。然後你可以訪問這個自定義屬性。 –

+0

好的,謝謝你,先生。我已經發布了答案。請你回顧一下,讓我知道如果我做對或錯? –

回答

1

最好的辦法是提供一個屬性在MasterPage一個有意義的名稱和類型string。該屬性獲取/設置UserControl中的標籤文本。

爲了達到這個目的,請在您的UserControl中提供同樣有意義的名稱和類型string。該屬性獲取/設置標籤的文本。

您必須將this.Master轉換爲MasterPage的實際類型,即Master1。然後你可以訪問這個自定義屬性。

因此,這裏是你的UserControl

public partial class UserControl1 : System.Web.UI.UserControl 
{ 
    protected void Page_Load(object sender, EventArgs e) 
    { 

    } 

    public string MeaningfulNameForLabelText 
    { 
     get { return this.lbl1.Text; } 
     set { this.lbl1.Text = value; } 
    } 
} 

這是您的MasterPage

public partial class Master1 : System.Web.UI.MasterPage 
{ 
    protected void Page_Load(object sender, EventArgs e) 
    { 

    } 

    public string MeaningfulNameForLabelText 
    { 
     get { return this.UserControl1.MeaningfulNameForLabelText; } 
     set { this.UserControl1.MeaningfulNameForLabelText = value; } 
    } 
} 

,這是你的頁面:

protected void Page_Load(object sender, EventArgs e) 
{ 
    var master = this.Master as Master1; 
    if (master != null) 
    { 
     master.MeaningfulNameForLabelText = "Hello"; 
    } 
} 
1

您是否嘗試首先查找用戶控件的父容器(例如#ParentContainer),然後在此對象上使用FindControl來查找所需的用戶控件?

參見:Find a control on a page with a master page

像這樣:

UserControl control = this.Master.FindControl("ParentContainer").FindControl("lbl1") as UserControl; 
+0

什麼是ParentContainer? –

+0

根據您更新的答案,我認爲這將是UserControl的ID,也許您還需要先爲ID爲'Load'的div添加另一個FindControl。 – Patric

0

確定後一些研究,我發現,他回答:

首先我發現,用戶控制象下面這樣:

UserControl uch = Page.Master.FindControl("UserControl1 ") as UserControl; 

在此之後,我從這個用戶控件中找到我的標籤,就像這樣:

if(uch!=null) 
      { 
       var data = (Label)uch.FindControl("lbl1"); 
       var d = data.Text; //getting text successfully 
      }