访问位于模板化用户控件中的子控件 ASP.NET

6
以下代码已经简化。
用户控件ascx:
<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="BaseFormControl.ascx.cs"
    Inherits="SOPR.CustomForms.BaseFormControl" %>
<fieldset class="fset1">
</fieldset>

这是我的用户控件代码后台:
public partial class BaseFormControl : System.Web.UI.UserControl
    {



        [TemplateContainer(typeof(ContentContainer))]
        [PersistenceMode(PersistenceMode.InnerProperty)]
        public ITemplate Content { get; set; }



   void Page_Init()
        {




            if (Content != null)
            {
                ContentContainer cc = new ContentContainer();
                Content.InstantiateIn(cc);
                contentHolder.Controls.Add(cc);
            }
        }

我在视图中的使用方法:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="AddOperator.aspx.cs"
    Inherits="SOPR.Cadastro.AddOperator" MasterPageFile="~/MasterPage.Master" %>

<asp:Content ContentPlaceHolderID="ContentPlaceHolder1" ID="maincont" runat="server"     EnableViewState="true">
    <uc:BaseFormControl ID="BaseFormControl1" runat="server">
        <Content>
      <asp:TextBox runat="server" CssClass="keytbcss" MaxLength="4" ID="keytb"
                NewLine="false" />
        </Content>
    </uc:BaseFormControl>

我试图在代码后台访问"keytb"控件,但好像它不存在(就像使用一个不存在的变量一样)。有什么想法吗?

提前感谢。

解决方案 --------------------------
我找到了一个非常好的解决方案,只需将用户控件的ITemplate属性添加 [TemplateInstance(TemplateInstance.Single)] ,就可以看到所有内容。现在我可以像正常页面控件一样使用它。

public partial class BaseFormControl : System.Web.UI.UserControl
{



[TemplateContainer(typeof(ContentContainer))]
[PersistenceMode(PersistenceMode.InnerProperty)]
[TemplateInstance(TemplateInstance.Single)]
public ITemplate Content { get; set; }
...

可能是在Web表单中查找控件的重复问题。 - John Saunders
有趣的是,我之前不知道TemplateInstance。你的解决方案很好!+1 - Johnny5
如果您将您的解决方案作为答案提交,我会给它点赞。 - John Saunders
谢谢,我会在有能力的时候添加它。很高兴能够帮助。为了完整起见,我在这里找到了答案:http://geekswithblogs.net/CodeSpeaker/archive/2009/07/04/templated-user-controls-in-asp.net-for-better-maintainability.aspx - WoF_Angel
3个回答

5

解决方案 --------------------------
我发现了一个非常好的解决方案,只需将 [TemplateInstance(TemplateInstance.Single)] 添加到用户控件的 ITemplate 属性中,就可以看到所有内容。现在,我可以像使用普通页面控件一样使用它。

public partial class BaseFormControl : System.Web.UI.UserControl
{



[TemplateContainer(typeof(ContentContainer))]
[PersistenceMode(PersistenceMode.InnerProperty)]
[TemplateInstance(TemplateInstance.Single)]
public ITemplate Content { get; set; }
...

0

当您在模板中编写控件时,您正在为其提供内容的示例。想象一下,在带有某个 ID“SomeTextBox”的模板中提供网格的内容,随着网格行数的增加,SomeTextBox 不能多次出现。控件将在运行时动态命名。

但是,您仍然有一种方法,您必须找到容器控件并应用 Control.FindControl() 方法。FindControl() 接受您在设计时给出的模板控件的 ID。


0
我会为您的用户控件编写一个访问内容控件的方法:
public Control FindInnerControl  (string id)
{
  if (contentHolder.Controls.Count > 0)
  {
    return contentHolder.Controls [0].FindControl (id); //The first control is your ContentContainer
  }
  return null;
}

然后在您页面的代码后台,您可以这样做

TextBox txtKeytbcss = (TextBox) BaseFormControl1.FindInnerControl ("keytbcss");

那个不起作用,总是返回 null。我找到了一个相当不错的解决方案,只需将 [TemplateInstance(TemplateInstance.Single)] 添加到用户控件的 ITemplate 属性中,就可以看到所有内容了。 - WoF_Angel
你是对的,因为你将你的控件添加到了 ContentContainer cc 中,然后再将 cc 添加到 contentHolder 中。我会进行编辑。 - Johnny5

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接