【问题标题】:ASP.NET Can't access user control's property in code-behind fileASP.NET 无法在代码隐藏文件中访问用户控件的属性
【发布时间】:2013-03-06 19:55:24
【问题描述】:

Visual Studio 2008、C#、ASP.NET

需要以编程方式制作 Web 用户控件的多个副本(或实例)。

我有 UserControlFile.ascx,其中包含一个 ID="vhLabel" 的 asp:Label。 在该文件中,我像往常一样通过公共字符串 vhText 变量设置标签的 Text 属性:

public string vhText
{
    set
    {
        vhLabel.Text = value;
    }
}

这个文件中还有一些div和其他html数据不能用C#编程创建,所以我必须使用ascx文件。

现在,在代码隐藏文件中,我需要:

  1. 多次克隆此用户控件;
  2. 通过“vhText”变量为每个克隆的标签属性“Text”设置唯一值。

请分享您对这些问题的建议。如果你需要,我可以在这里展示我的代码。 我一直在寻找答案很长时间,但仍然没有成功。

【问题讨论】:

    标签: asp.net user-controls code-behind


    【解决方案1】:

    您可以在此处找到有关如何以编程方式将用户控件添加到页面的演练:http://msdn.microsoft.com/en-us/library/c0az2h86(v=vs.100).aspx

    在您的情况下,您的 UserControlFile.ascx 控件中需要这样的东西(className 属性是重要的位):

    <%@ Control Language="C#" AutoEventWireup="true" CodeFile="UserControlFile.ascx.cs" Inherits="UserControlFile" className="MyUserControl" %>
    <asp:Label ID="vhLabel" runat="server"></asp:Label>
    

    然后,在包含控件的页面顶部(更改适合您结构的文件路径):

    <%@ Reference Control="~/Controls/UserControlFile.ascx" %>
    

    最后,页面后面的代码将包含通过LoadControl 方法和MyUserControl 类型的使用以编程方式添加控件实例的代码 - 在@Control 的className 属性中定义上面的指令:

    protected void Page_Load(object sender, EventArgs e)
    {
        var control = (ASP.MyUserControl)LoadControl("~/Controls/UserControlFile.ascx");
        control.vhText = "1";
        Page.Controls.Add(control);
    
        control = (ASP.MyUserControl)LoadControl("~/Controls/UserControlFile.ascx");
        control.vhText = "2";
        Page.Controls.Add(control);
    
        /* etc... */
    }
    

    这应该为您指明正确的方向...

    【讨论】:

    • 好的,谢谢,终于成功了。你现在能帮我做一件小事吗?我没有看到以编程方式创建任意数量的这些控件的方法。我通常使用“myLabel = new Label”之类的结构,然后将它们作为控件添加到 TableCells 中。我如何使用我的用户控件来做到这一点?
    • myLabel = new Label 将被上面的var control... 行替换,例如var myLabel = (ASP.MyUserControl)LoadControl("~/Controls/UserControlFile.ascx"); 然后像往常一样将控件添加到您的 TableCell 中。
    【解决方案2】:

    你需要使用LoadControl方法:

    MyUserControl control = (MyUserControl)Page.LoadControl("~/UserControlFile.ascx");
    control.vhText = "first control";
    Page.Controls.Add(control);
    
    control = (MyUserControl)Page.LoadControl("~/UserControlFile.ascx");
    control.vhText = "second control";
    Page.Controls.Add(control);
    
    control = (MyUserControl)Page.LoadControl("~/UserControlFile.ascx");
    control.vhText = "third control";
    Page.Controls.Add(control);
    

    【讨论】:

    • @Vladimir 您必须在某处有这样的行:public partial class [something here] : System.Web.UI.UserControl 所以只需将上面示例代码中的“MyUserControl”替换为您看到的实际类名,而不是“这里的东西”。确保后面的控制代码使用相同的命名空间。
    猜你喜欢
    • 1970-01-01
    • 2012-07-10
    • 1970-01-01
    • 1970-01-01
    • 2012-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多