0

我正在尝试构建一个模板化控件。您将看到作为字段部分的一部分,我希望能够将控件定义为子控件。当我尝试编译时,我收到错误消息“ MyTemplateControl.Field'没有名为'Button'的公共属性”。有谁知道如何完成我想要做的事情?

下面是一个示例 XHTML 标记,下面是我的控件实现。

我已经编辑了我的示例,希望能阐明我在寻找什么。感谢大家提供 MSDN 链接。我已经经历过那些了。
我正在尝试构建的是一个数据输入控件,它将为我自动格式化表格。我们做了很多数据输入网络表单,我想缩短实施时间。

<cc1:MyForm ID="MyForm1" runat="server">
    <ViewTemplate>
        <cc1:Field Question="What is your name?">
            <asp:Label ID="myLabel" runat="server" />
        </cc1:Field>
    </ViewTemplate>
    <EditTemplate>
        <cc1:Field Question="What is your name?">
            <asp:Textbox ID="myTextbox" runat="server" />
        </cc1:Field>
    </EditTemplate>
</cc1:MyForm>

public class MyForm : WebControl, INamingContainer
{
    private FieldCollection _fieldCollection;
    private FieldCollection _field2Collection;

    public FieldCollection ViewTemplate
    {
        get
        {
            if (_fieldCollection == null)
            {
                _fieldCollection = new FieldCollection();
            }
            return _fieldCollection;
        }
    }

    public FieldCollection EditTemplate
    {
        get
        {
            if (_field2Collection == null)
            {
                _field2Collection = new FieldCollection();
            }
            return _field2Collection;
        }
    }
}

public class FieldCollection : CollectionBase
{
   .
   .
   .
}

[ParseChildren(false)]
public class Field 
{ 
   . 
   . 
   . 
}
4

3 回答 3

2

你的实现中有一些奇怪的东西。很难理解您想要做什么,要么构建模板化控件,要么构建一个可以在其上添加子控件列表的控件。

对于模板化方法,您必须执行以下操作:

public class MyForm : WebControl, INamingContainer
{

   private TemplateOwner templateOwner{ get; set; }

   private ITemplate _Content;
   public ITemplate Content
   {
      get
      {
         return this._Content;
      }
      set
      {
         _Content = value;
      }
   }

   protected override void CreateChildControls()
   {
      base.Controls.Clear();

      templateOwner = new TemplateOwner();
      this.Content.InstantiateIn(templateOwner);

      this.Controls.Add(templateOwner);
   }

   ...
}

[ToolboxItem(false)]
public class TemplateOwner : WebControl{

  public TemplateOwner():base(HtmlTextWriterTag.Div)
  {
  }
}

然后用法看起来像

<cc1:MyForm ID="MyForm1" runat="server">
    <Content>
        <!-- Place whatever HTML, ASP.net controls etc you like -->
    </Content>
</cc1:MyForm>

您仍然需要添加适当的注释来配置设计器的行为。我只是快速写下来给你一个想法。

于 2009-08-17T13:44:15.253 回答
0

GridView 也不允许这样的操作,而是使用 MyForm1.FindControl("mybutton")

另外我注意到您的模板不是从 ITemplate 接口派生的。像往常一样,ASP.Net 也使用 System.Web.UI.Control 作为这个 impl 的基类。

于 2009-08-17T13:34:02.067 回答
0

我使用了以下代码:

public partial class SmallFramedControl : UserControl, INamingContainer 
{
    private TemplateOwner templateOwner { get; set; }
    private ITemplate _Content;
    public ITemplate Content
    {
        get
        {
            return this._Content;
        }
        set
        {
            _Content = value;
        }
    }

    protected override void CreateChildControls()
    {
        //base.Controls.Clear();
        templateOwner = new TemplateOwner();
        this.Content.InstantiateIn(templateOwner);
        plchAdd.Controls.Add(templateOwner);
    }



    protected void Page_Load(object sender, EventArgs e)
    {

    }
}

[ToolboxItem(false)]
public class TemplateOwner : WebControl
{
    public TemplateOwner()
        : base(HtmlTextWriterTag.Div)
    {
    }
}

和 ascx 页面看起来像:

<%@ Control Language="C#" AutoEventWireup="true"
            CodeBehind="SmallFramedControl.ascx.cs"
            Inherits="OtPortalNewDesign.UserControls.SmallFramedControl" %>

这将是框架的顶部

<asp:PlaceHolder ID="plchAdd" runat="server"></asp:PlaceHolder>

这将是框架的底部

于 2010-06-07T14:13:02.213 回答