0

テンプレート化されたコントロールを構築しようとしています。Field セクションの一部として、コントロールを子として定義できるようにしたいと考えています。コンパイルしようとすると、「MyTemplateControl.Field' には 'Button' という名前のパブリック プロパティがありません」というエラー メッセージが表示されます。私がやろうとしていることを達成する方法を知っている人はいますか?

以下に XHTML マークアップの例を示し、その下に私のコントロールの実装を示します。

探しているものを明確にするために、例を編集しました。MSDN リンクをありがとうございます。私はすでにそれらを経験してきました。
私が構築しようとしているのは、テーブルを自動フォーマットするデータ入力コントロールです。私たちは多くのデータ入力 Web フォームを行っており、実装時間を短縮したいと考えています。

<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 に答える