7

DataSourceが空の場合にのみ、プロパティに基づいてヘッダー/フッターを表示するリピーターを作成したいと思います。

public class Repeater : System.Web.UI.WebControls.Repeater
{
    public bool ShowHeaderOnEmpty { get; set; }
    public bool ShowFooterOnEmpty { get; set; }

    [DefaultValue((string)null),
    PersistenceMode(PersistenceMode.InnerProperty),
    TemplateContainer(typeof(System.Web.UI.WebControls.RepeaterItem)),
    Browsable(false)]
    public ITemplate EmptyTemplate { get; set; }
}

また、を作成したいのですが、空EmptyTemplateの場合はDataSourceこのテンプレートを表示します...

これを実装する方法がわかりません。この動作を実現するには、何をオーバーライドする必要がありますか?

4

5 に答える 5

4
[ToolboxData("<{0}:SmartRepeater runat=\"server\"></{0}:SmartRepeater>")]
public partial class SmartRepeater : Repeater
{
    public bool ShowHeaderOnEmpty { get; set; }
    public bool ShowFooterOnEmpty { get; set; }

    private ITemplate emptyTemplate = null;

    [PersistenceMode(PersistenceMode.InnerProperty)]
    public ITemplate EmptyTemplate
    {
        get { return this.emptyTemplate; }
        set { this.emptyTemplate = value; }
    }

    protected override void OnDataBinding(EventArgs e)
    {
        base.OnDataBinding(e);
        if (this.Items.Count == 0)
        {
            this.Controls.Clear();

            if (this.HeaderTemplate != null && ShowHeaderOnEmpty)
                this.HeaderTemplate.InstantiateIn(this);

            if (this.EmptyTemplate!=null)
                this.EmptyTemplate.InstantiateIn(this);

            if (this.FooterTemplate != null && ShowFooterOnEmpty)
                this.FooterTemplate.InstantiateIn(this);
        }
    }
}

使用法:

<UC:SmartRepeater ID="rep" runat="server" ShowHeaderOnEmpty="true" ShowFooterOnEmpty="true">
    <HeaderTemplate>HEADER</HeaderTemplate>
    <ItemTemplate>Item</ItemTemplate>
    <SeparatorTemplate>, </SeparatorTemplate>
    <EmptyTemplate><b>Nothing</b></EmptyTemplate>
    <FooterTemplate>FOOTER</FooterTemplate>
</UC:SmartRepeater>
于 2010-09-26T13:22:29.613 に答える
2

Repeaterの代わりにListViewを使用してください。すでにEmptyDataTemplate要素とEmptyItemTemplate要素が含まれているため、何もする必要はありません:)

于 2010-09-20T11:02:28.747 に答える
0

ヘッダーセクション、[子]リピーターコントロール、およびフッターセクションを含むWebユーザーコントロール(.ascx)を作成します。すべてのロジックをそのカスタムコントロールに入れることができます。

于 2010-09-17T18:23:35.957 に答える
0

リピーターだけでこれを実行したい場合は、次のように実行できます。

    <asp:Repeater runat="server" OnItemDataBound="ShowHideHeaderFooter">
    <HeaderTemplate>
        <asp:PlaceHolder runat="server" ID="PlaceHolderHeader">
            HEADER STUFF
        </asp:PlaceHolder>
    </HeaderTemplate>
    <ItemTemplate>
        ITEM STUFF
    </ItemTemplate>
    <FooterTemplate>
        <asp:PlaceHolder runat="server" ID="PlaceHolderFooter">
            FOOTER STUFF
        </asp:PlaceHolder>
    </FooterTemplate>
</asp:Repeater>

その後、コードビハインドで

    protected void ShowHideHeaderFooter(object sender, RepeaterItemEventArgs e)
    {
        if(e.Item.ItemType == ListItemType.Header && theDataSource.Count == 0 && !ShowHeaderOnEmpty)
        {
            e.Item.FindControl("PlaceHolderHeader").Visible = false;
        }
        ...
    }
于 2010-09-17T21:19:15.503 に答える
0

レンダリングイベントをオーバーライドして、言及したすべてのプロパティに基づいて必要なHTMLを出力します。

于 2010-09-21T10:18:28.363 に答える