2016-02-05 63 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 
      }