1

通常の.netdatagridやajaxタブ付きコントロールなどの内部htmlを受け入れるカスタムコントロールを作成するにはどうすればよいですか...次のようになります。

<KITT:tabs id="s" runat="server" >
 <w:tab sectionid="benefits">
here goes my html or any content, i want to render as is
 </w:tab>
</KITT:tabs>

内部html、Tabオブジェクト、Tabのリストを使用せずに作成し、次を使用する方法を知っています。

[ParseChildren(true,"MyTabs")]

コントロールで...しかし、私はそこからどこに行くべきかわからない、何かヒントはありますか?

4

3 に答える 3

1

一般的なカスタム コントロールに関する回答を組み合わせる: カスタム子コントロール

およびMSDN テンプレート コントロール

これを行う正しい方法は非常に単純です。名前空間で子要素を作成して定義すると (相互参照する必要があるため)、プロパティが 1 つ追加されます。Tab クラスは次のようになります。

namespace MyNS.Content {
public class Tab : System.Web.UI.UserControl
{

    private string _title;

    public Tab()
        : this(String.Empty)
    {
    }

    public Tab(string title)
    {
        _title = title;
    }

    public string Title
    {
        get { return _title; }
        set { _title = value; }
    }

    private ITemplate tabContent = null;
    [
    TemplateContainer(typeof(TemplateControl)),
    PersistenceMode(PersistenceMode.InnerProperty),
    TemplateInstance(TemplateInstance.Single),
    ]
    public ITemplate TabContent
    {
        get
        {
            return tabContent;
        }
        set
        {
            tabContent = value;
        }
    }

}
}

これにより、タブコンテンツの子がメインタグに許可されます

コントロール ascx で必要な [ParseChildren(true, "MyTabs")] を作成し、MyTabs リストまたはコレクションをリピーターにバインドします。これにより、含まれているすべてのタブが出力されます。ascx は次のようになります。

<asp:repeater id="rpContent" runat="server" onitemdatabound="rpContent_itemdatabound">
<itemtemplate>
    <asp:hyperlink id="hlHeader" runat="server" navigateurl="javascript://"></asp:hyperlink>

        <div>
            <asp:placeholder id="plTabContent" runat="server"></asp:placeholder>
        </div>

</itemtemplate>

コードビハインドは次のようになります

[ParseChildren(true, "MyTabs")]
public partial class KITT_controls_tabgroup : System.Web.UI.UserControl
{
    private List<Tab> _myTabs;
    [PersistenceMode(PersistenceMode.InnerProperty)]
    public List<Tab> MyTabs
    {
        get
        {
            if (_myTabs == null)
            {
                _myTabs = new List<Tab>();
            }
            return _myTabs;
        }

    }

    protected void Page_Load(object sender, EventArgs e)
    {
        rpContent.DataSource = MyTabs;
        rpContent.DataBind();

    }
    protected void rpContent_itemdatabound(Object Sender, RepeaterItemEventArgs e)
    {

        if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
        {
            Tab i = e.Item.DataItem as Tab;
            i.TabContent.InstantiateIn(((PlaceHolder)e.Item.FindControl("plTabContent")));

            ((HyperLink)e.Item.FindControl("hlHeader")).Text = i.Title;
        }
    }
}

最後に、コントロール (Tab と ascx の両方) を登録します。

<add tagPrefix="w" namespace="MyNS.Content" />
<add tagPrefix="KITT" tagName="TabbedContent" src="~/controls/tabbedcontent.ascx"/>

そしてそれを使う...

 <kitt:tabbedcontent id="upgradedesktop" runat="server">
    <w:Tab  title="Overview" isdefault="true" runat="server">
        <TabContent>
            your html tags and server side tags here
        </TabContent>
    </w:Tab>
    <w:tab title="Benefits" runat="server" >
        <tabcontent>
            your html tags and server side tags here
        </tabcontent>
    </w:tab>
    <w:tab title="Products" runat="server">
        <tabcontent>
            your html tags and server side tags here
        </tabcontent>
    </w:tab>
</kitt:tabbedcontent>
于 2009-10-29T03:40:09.840 に答える
0

あなたが探しているのは、「テンプレート化されたコントロール」と呼ばれるものです。詳細については、MSDN を参照してください。

于 2009-10-28T03:37:10.983 に答える