0

を制御します我々が開発するアプリケーション。コントロールHTMLコントロールの理由は、複数のオンラインのために一貫性のあるコンテンツエリア(HTML要素)を持つことができるようにすることです、私はCompositeControl</p> <p>から継承し、私の最初のカスタムサーバーコントロールを構築しています

だからではなく、常にアウト入力したの:

<div class="titleBar"> 
</div> 
<div class="actionBar"> 
</div> 
<div class="workspace"> 
</div> 

を次のように、開発者がサーバーコントロールを追加することができます。

<custom:Workspace id="..." runat="server" Title="MyTitle"> 
    <TitleBar> 
     Here is the title 
    </TitleBar> 
    <ActionBar> 
     <asp:button id="..." runat="server" Title="MyButton" /> 
    </ActionBar> 
    <Content> 
     <asp:DataGrid id="..." runat="server" /> 
    </Content> 
</custom:Workspace> 

私はhttp://msdn.microsoft.com/en-us/library/ms178657.aspxで記事を読んで、それは動作しますが、問題私はなぜそれが理解できないのですか? (誰もこの種類のサーバーコントロールを構築する方法を説明している記事の素人版へのリンクを持っていますか?)

私が今まで知っている主なことは、SPAN要素の束もちろん私は欲しくない。

新しいCompositeControlが出力しているHTMLをどのように制御しますか?

おかげで、 ジャック

PS。ここに私のコードは、これまでのところです:

using System; 
using System.ComponentModel; 
using System.Drawing; 
using System.Security.Permissions; 
using System.Web; 
using System.Web.UI; 
using System.Web.UI.WebControls; 
using System.Web.UI.Design; 
namespace TemplatedServerControl 
{ 
    [DefaultProperty("Title")] 
    [ToolboxData("<{0}:Workspace runat=server></{0}:Workspace>")] 
    public class Workspace : CompositeControl 
    { 
     #region FIELDS 
     private ITemplate _TitleBarTemplateValue; 
     private ITemplate _ActionBarTemplateValue; 
     private TemplateOwner _TitleBarOwnerValue; 
     private TemplateOwner _ActionBarOwnerValue; 
     #endregion 
     #region PROPERTY - TitleBarOwner 
     [Browsable(false), 
     DesignerSerializationVisibility(
     DesignerSerializationVisibility.Hidden)] 
     public TemplateOwner TitleBarOwner 
     { 
      get 
      { 
       return _TitleBarOwnerValue; 
      } 
     } 
     #endregion 
     #region PROPERTY - ActionBarOwner 
     [Browsable(false), 
     DesignerSerializationVisibility(
     DesignerSerializationVisibility.Hidden)] 
     public TemplateOwner ActionBarOwner 
     { 
      get 
      { 
       return _ActionBarOwnerValue; 
      } 
     } 
     #endregion 
     #region PROPERTY - Title 
     [Bindable(true)] 
     [Category("Appearance")] 
     [DefaultValue("[Provide the title for the workspace]")] 
     [Localizable(true)] 
     public string Title 
     { 
      get 
      { 
       String s = (String)ViewState["Title"]; 
       return ((s == null) ? "[" + this.ID + "]" : s); 
      } 

      set 
      { 
       ViewState["Text"] = value; 
      } 
     } 
     #endregion 
     #region PROPERTY - TitleBar 
     [Browsable(false), 
     PersistenceMode(PersistenceMode.InnerProperty), 
     DefaultValue(typeof(ITemplate), ""), 
     Description("Control template"), 
     TemplateContainer(typeof(Workspace))] 
     public virtual ITemplate TitleBar 
     { 
      get 
      { 
       return _TitleBarTemplateValue; 
      } 
      set 
      { 
       _TitleBarTemplateValue = value; 
      } 
     } 
     #endregion 
     #region PROPERTY - ActionBar 
     [Browsable(false), 
     PersistenceMode(PersistenceMode.InnerProperty), 
     DefaultValue(typeof(ITemplate), ""), 
     Description("Control template"), 
     TemplateContainer(typeof(Workspace))] 
     public virtual ITemplate ActionBar 
     { 
      get 
      { 
       return _ActionBarTemplateValue; 
      } 
      set 
      { 
       _ActionBarTemplateValue = value; 
      } 
     } 
     #endregion 
     #region METHOD - CreateChildControls() 
     protected override void CreateChildControls() 
     { 
      //base.CreateChildControls(); 
      Controls.Clear(); 

      _TitleBarOwnerValue = new TemplateOwner(); 
      _ActionBarOwnerValue = new TemplateOwner(); 

      ITemplate temp1 = _TitleBarTemplateValue; 
      ITemplate temp2 = _ActionBarTemplateValue; 

      temp1.InstantiateIn(_TitleBarOwnerValue); 
      temp2.InstantiateIn(_ActionBarOwnerValue); 

      this.Controls.Add(_TitleBarOwnerValue); 
      this.Controls.Add(_ActionBarOwnerValue); 
     } 
     #endregion 
     #region METHOD - RenderContents(HtmlTextWriter writer) 
     protected override void RenderContents(HtmlTextWriter writer) 
     { 
      base.RenderContents(writer); 
     } 
     #endregion 
    } 

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

答えて

1

TemplateOwnerから継承)WebControlはデフォルトで<span>タグをレンダリングするための余分な<span>要素がTemplateOwnerコントロールから来ています。

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

しかし、あなたは、テンプレートを使用して独自のクラスを作成する必要はありません:あなたは、レンダリングするために、タグを指定する TemplateOwnerを変更することができます。たとえば、 Panelコントロールを使用することができます。

private Panel _TitleBarPanel; 
private Panel _ActionBarPanel; 

protected override void CreateChildControls() 
{ 
    _TitleBarPanel = new Panel { CssClass = "titleBar" }; 
    _TitleBarTemplateValue.InstantiateIn(_TitleBarPanel); 
    this.Controls.Add(_TitleBarPanel); 

    _ActionBarPanel = new Panel { CssClass = "actionBar" }; 
    _ActionBarTemplateValue.InstantiateIn(_ActionBarPanel); 
    this.Controls.Add(_ActionBarPanel); 
} 
+0

おかげでマイケルは本当にそれを感謝しています。私はそれを試してみましょう。複合コントロールとテンプレートについて詳しく説明するチュートリアルへのリンクがありますか? – Jacques

+0

私は頭の上から何か記事を知りません。より多くの質問がある場合は、お気軽にお問い合わせください。 :-) –

0

PlaceHolderコントロールを使用するより簡単なソリューションです。 CompositeControlと同様に、これはコンテナコントロールです。 ただし、CompositeControlとは異なり、コンテンツをまったく表示することはありません。

これは、CompositeControlの場合と同様に、コントロール全体をプログラムで参照することはできませんが、必要でない可能性があることに応じて、コントロールの内容全体を参照することはできません。

あなたが子供を参照できるように、各サブコントロールは、しかし固有のIDを持つことになり、プログラムで制御します(イベントなどを扱う)

関連する問題

 関連する問題