如何从用户控件母版页内的内容页中找到标签控件?
How to find label control from content page which is inside master page of user control?
我有一页:Abc.aspx
在这个 Abc.aspx 页面上,我使用了一个主页,即 Master1.Master.
现在在这个母版页上,我将 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>
您是否尝试过先找到用户控件的父容器(例如#ParentContainer),然后在此对象上使用 FindControl 来找到所需的用户控件?
参见:Find a control on a page with a master page
像这样:
UserControl control = this.Master.FindControl("ParentContainer").FindControl("lbl1") as UserControl;
好的,经过一番研究,我发现他的回答是:
首先我发现用户控件如下所示:
UserControl uch = Page.Master.FindControl("UserControl1 ") as UserControl;
在此之后,我从这个用户控件中找到我的标签,如下所示:
if(uch!=null)
{
var data = (Label)uch.FindControl("lbl1");
var d = data.Text; //getting text successfully
}
最好的方法是在您的 MasterPage
中提供 属性 具有有意义的名称和类型 string
。此属性gets/sets标签中的文本UserControl
。
为了满足此要求 objective 在您的 UserControl
中也提供一个 属性 具有相同的有意义的名称和类型 string
。这 属性 gets/sets 标签的文本。
您必须将 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";
}
}
我有一页:Abc.aspx
在这个 Abc.aspx 页面上,我使用了一个主页,即 Master1.Master.
现在在这个母版页上,我将 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>
您是否尝试过先找到用户控件的父容器(例如#ParentContainer),然后在此对象上使用 FindControl 来找到所需的用户控件?
参见:Find a control on a page with a master page
像这样:
UserControl control = this.Master.FindControl("ParentContainer").FindControl("lbl1") as UserControl;
好的,经过一番研究,我发现他的回答是:
首先我发现用户控件如下所示:
UserControl uch = Page.Master.FindControl("UserControl1 ") as UserControl;
在此之后,我从这个用户控件中找到我的标签,如下所示:
if(uch!=null)
{
var data = (Label)uch.FindControl("lbl1");
var d = data.Text; //getting text successfully
}
最好的方法是在您的 MasterPage
中提供 属性 具有有意义的名称和类型 string
。此属性gets/sets标签中的文本UserControl
。
为了满足此要求 objective 在您的 UserControl
中也提供一个 属性 具有相同的有意义的名称和类型 string
。这 属性 gets/sets 标签的文本。
您必须将 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";
}
}