【问题标题】:How to find label control from content page which is inside master page of user control?如何从用户控件母版页内的内容页中找到标签控件?
【发布时间】:2016-05-15 05:08:22
【问题描述】:

我有一页:Abc.aspx

在这个 Abc.aspx 页面上,我使用了一个母版页,即 Master1.Master

现在在这个母版页上,我将 1 个用户控件名称呈现为 Usercontrol1.ascx。

在这个用户控件上,我放置了 1 个名为 lbl1 的标签。

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

所以现在在 Abc.aspx 页面的页面加载事件中,我想找到这个控件,我已经尝试过但得到了 null:

 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>

【问题讨论】:

  • 最好的方法是在您的MasterPage 中提供一个具有有意义名称的属性并输入string。此属性获取/设置UserControl 中标签的文本。为了达到这个目标,还要在您的UserControl 中提供一个具有相同含义名称的属性并键入string。此属性获取/设置标签的文本。您必须将this.Master 转换为MasterPage 的实际类型Master1。然后你就可以访问这个自定义属性了。
  • 好的,谢谢先生。我已经发布了答案。请你检查一下,让我知道我做对了还是错了?

标签: c# asp.net user-controls master-pages findcontrol


【解决方案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";
    }
}

【讨论】:

    【解决方案2】:

    好的,经过一番研究,我发现他回答了:

    首先我发现用户控件如下所示:

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

    在此之后,我从这个用户控件中找到我的标签,如下所示:

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

    【讨论】:

      【解决方案3】:

      您是否尝试过先找到用户控件的父容器(例如#ParentContainer),然后在该对象上使用 FindControl 来查找所需的用户控件?

      见:Find a control on a page with a master page

      像这样:

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

      【讨论】:

      • 什么是 ParentContainer??
      • 根据您更新的答案,我认为这将是 UserControl 的 ID,也许您还需要先为 ID 为“Load”的 div 添加另一个 FindControl。
      猜你喜欢
      • 1970-01-01
      • 2011-04-19
      • 1970-01-01
      • 1970-01-01
      • 2014-03-27
      • 2010-09-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多