サーバーコントロール、コントロールベースクラス、およびそれらのクラスの使用方法の作成に関する話題を紹介してくれることを願っています。カスタムサーバーコントロール - 基底クラスと使用法
ここに私が達成したいものの例があります。
<div id="MyPanel" class="panel scroll-contents">
<div class="panel-header">
<div class="panel-header-l"></div>
<div class="panel-header-c">
<div class="panel-header-wrapper">My Panel Header</div>
</div>
<div class="panel-header-r"></div>
</div>
<div class="panel-toolbars">
// HTML of Toolbar control
</div>
<div class="panel-body">
<div class="panel-body-t">
<div class="panel-body-tl"></div>
<div class="panel-body-tc"></div>
<div class="panel-body-tr"></div>
</div>
<div class="panel-body-m">
<div class="panel-body-ml"></div>
<div class="panel-body-mc">
<div class="panel-body-wrapper">
// Contents
</div>
</div>
<div class="panel-body-mr"></div>
</div>
<div class="panel-body-b">
<div class="panel-body-bl"></div>
<div class="panel-body-bc"></div>
<div class="panel-body-br"></div>
</div>
</div>
<div class="panel-footer">
<div class="panel-footer-l"></div>
<div class="panel-footer-c">
<div class="panel-footer-wrapper">
// Footer contents
</div>
</div>
<div class="panel-footer-r"></div>
</div>
</div>
は、開発者は、任意のを省略することができるはずです。
<acme:Panel ID="MyPanel" runtat="server" Scrolling="true">
<Header>My Panel Header</Header>
<Toolbars>
<acme:Toolbar ID="Toolbar1" runat="server"/>
<acme:Toolbar ID="Toolbar2" runat="server"/>
</Toolbars>
<Contents>
<%-- Some Content for the Contents section --%>
</Contents>
<Footer>
<%-- Some Content for the Footer section --%>
</Footer>
</acme:Panel>
それは、次のHTMLをレンダリングする必要があります:私は1つはそうのようなASPXマークアップでインスタンス化できるカスタムパネルコントロールを作成したいです目次セクション以外のセクション。省略されたセクションのHTMLはレンダリングされません。プラスユーザーは、ページの背後にあるコードにPanelコントロールを追加し、そのように、Panelコントロールのさまざまなセクションに追加のコントロールを追加/インスタンス化することができるはずです。
ACME.Panel MyPanel = new ACME.Panel();
MyPlaceHolder.Controls.Add(MyPanel);
MyPanel.Header = "My Panel Header";
MyPanel.Toolbars.Controls.Add(new ACME.Toolbar());
MyPanel.Footer.Controls.Add(new Literal());
MyPanel.Contents.Controls.Add(new GridView());
私は次の記事を読みました:カスタムクラスのASP.NETサーバーコントロールの作成(基本クラスは何ですか?)
開発者が自分のコントロールのスタイリングを変更しないようにしたいので、System.Web.UI.Controlの基底クラスで十分ですしかし、私はまた、INamingContainerインターフェイスを適用する必要があります。したがって、私のコントロールはそうのようになります。
using System.Web;
using System.Web.UI;
using System.Web.UI.Design;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.ComponentModel;
using System.ComponentModel.Design;
using System.Security.Permissions;
namespace ACME
{
[ToolboxData("<{0}:Panel runat=server></{0}:Panel >")]
[ParseChildren(true)]
public class Panel : Control, INamingContainer
{
private string _header;
private ITemplate _toolbars;
private ITemplate _contents;
private ITemplate _footerContents;
public DialogBox()
{
}
[Browsable(false),
PersistenceMode(PersistenceMode.InnerProperty)]
public virtual ITemplate Toolbars
{
get { return _toolbars; }
set { _toolbars = value; }
}
[Browsable(false),
PersistenceMode(PersistenceMode.InnerProperty)]
public virtual ITemplate Contents
{
get { return _contents; }
set { _contents= value; }
}
[Browsable(false),
PersistenceMode(PersistenceMode.InnerProperty)]
public virtual ITemplate Footer
{
get { return _footerContents; }
set { _footerContents = value; }
}
}
}
を私は多くのチュートリアルを読みましたが、彼らは私の意図した実装を覆ったり、特定のアプローチが取られた理由を説明していないのいずれか。彼らはまた私を混乱させて、JavaScriptを使って必要なHTMLを動的にレンダリングしました。そこにControl Guruがいる場合は、この作業にどのように取り組んだのか説明してください。