创建ASP.Net DataBound控件,用于呈现具有多个tbodies的表

时间:2015-02-09 19:04:25

标签: c# html asp.net data-binding

我需要创建一个数据绑定控件,其中每个项呈现<tbody><ItemTemplate></tbody>。此外,我还想将<HeaderTemplate>放在<thead>而不是<tbody>行中<asp:DataList>。我需要完全控制项目模板。它需要能够呈现可编辑的行,如DataList那样。

我相信我需要为此制作一个自定义控件(但如果没有,请告诉我 - 这会节省很多时间)。什么是最好的父类?我的猜测是DataListDataBoundControl

1 个答案:

答案 0 :(得分:0)

我正在寻找的是<asp:Repeater>,只需要一些额外的代码进行编辑,因为它没有<EditItemTemplate>

<强>的.ascx

<asp:Repeater id="rItems" runat="server" OnItemCommand="rItems_ItemCommand" OnItemDataBound="rItems_ItemDataBound">
    <HeaderTemplate>
        <table>
            <thead>...</thead>
    </HeaderTemplate>
    <ItemTemplate>
        <tbody id="itemRows" runat="server">
            ...
            <asp:Button ... CommandName="Edit" />
            ...
        </tbody>
        <tbody id="editItemRows" runat="server" visible="false">...</tbody>
    </ItemTemplate>
    <FooterTemplate>
        </table>
    </FooterTemplate>
</asp:Repeater>

<强> .ascx.cs

private int m_editIndex = -1;

protected void rItems_ItemCommand(object sender, RepeaterCommandEventArgs e)
{
    switch (e.CommandName)
    {
        case "Edit":
            m_editIndex = e.Item.ItemIndex;
            break;
        ... // Cancel, Update, Delete, etc
        case "Cancel":
            m_editIndex = -1;
            break;
    }

    BindItemsDataSource();
}

protected void rItems_ItemDataBound(object sender, RepeaterItemEventArgs e)
{
    if (e.Item.ItemType == ListItemType.Item | e.Item.ItemType == ListItemType.AlternatingItem)
    {
        bool edit = e.Item.ItemIndex == m_editIndex;
        HtmlGenericControl tbody = e.Item.FindControl("itemRows") as HtmlGenericControl;
        tbody.Visible = !edit;
        tbody = e.Item.FindControl("editItemRows") as HtmlGenericControl;
        tbody.Visible = edit;

        if (edit)
        {
            PopulateEditableFieldValues(e.Item);
        }
    }
}