在Repeater中格式化数据

时间:2011-12-02 09:19:34

标签: asp.net controls

存储过程的结果将如下所示。

    1   Group Admin     user1    
    1   Group Admin     user2 
    1   Group Admin     user3
    1   Group Admin     user4 
    1   Group Admin     user5    
    2   Group Second    user6    
    2   Group Second    user7 
    2   Group Second    user8    
    2   Group Second    user9    
    2   Group Second    user10 
    2   Group Second    user11

我想格式化数据,如图所示。

该问题与this

有关

我认为Repeater是此处使用的最佳控件。你认为呢 ?如果是这样,我该如何格式化呢?  GridView行合并是个好主意吗?

enter image description here

阅读答案后

// Page_Load
DataSet ds = GetAllUsers();

ViewState["UserRoles"] = ds;

rptParent.DataSource = ds;
rptParent.DataBind();

其他活动

// ItemDataBound
 protected void rptParent_ItemDataBound(object sender, RepeaterItemEventArgs e)
        {
            RepeaterItem item = e.Item;
            if ((item.ItemType == ListItemType.Item) ||
                (item.ItemType == ListItemType.AlternatingItem))
            {
                string s = e.Item.DataItem.ToString();
                string roleID = ((HiddenField)e.Item.FindControl("hidRoleId")).Value;
                Repeater childRepeater = (Repeater)item.FindControl("rptChild");
                string filterExp = "RoleId=" + roleID;
                DataTable dtChild = ((DataSet)ViewState["UserRoles"]).Tables[0];
                DataRow[] dr = dtChild.Select(filterExp);
                childRepeater.DataSource = dr;
                childRepeater.DataBind();
            }
        }

标记

// MarkUp
<asp:Repeater runat="server" ID="rptParent" OnItemDataBound="rptParent_ItemDataBound">
            <ItemTemplate>
                <table>
                    <tr>
                        <td>
                            <asp:HiddenField ID="hidRoleId" runat="server" Value='<%#Eval("RoleId")%>' />
                            <asp:Label ID="lblRoleName" runat="server" Text='<%#Eval("RoleName")%>'></asp:Label>
                        </td>
                        <td>
                            <asp:CheckBox ID="CheckBox4" runat="server" />
                        </td>
                        <td>
                            <asp:CheckBox ID="CheckBox5" runat="server" />
                        </td>
                        <td>
                            <asp:CheckBox ID="CheckBox6" runat="server" />
                        </td>
                    </tr>
                </table>
                <asp:Repeater ID="rptChild" runat="server">
                    <ItemTemplate>
                        <table>
                            <tr>
                                <td>
                                    <asp:HiddenField ID="hidRoleId" runat="server" Value='<%#Eval("UserId")%>' />
                                    <asp:Label ID="Label2" runat="server" Text='<%# DataBinder.Eval(Container.DataItem, "UserName") %>'></asp:Label>
                                </td>
                                <td>
                                    <asp:CheckBox ID="CheckBox7" runat="server" />
                                </td>
                                <td>
                                    <asp:CheckBox ID="CheckBox8" runat="server" />
                                </td>
                                <td>
                                    <asp:CheckBox ID="CheckBox9" runat="server" />
                                </td>
                            </tr>
                        </table>
                    </ItemTemplate>
                </asp:Repeater>
            </ItemTemplate>
        </asp:Repeater>

我得到以下输出

enter image description here

但是群组名称也在重复:(。这不是我想要的

1 个答案:

答案 0 :(得分:1)

我会使用嵌套转发器。

使用Linq,您可以轻松地对数据进行分组并将其绑定到外部转发器(并设置3个顶部复选框的值),然后外部转发器的OnDataBound可以将“用户”列表设置为嵌套转发器的数据源。 / p>

标记看起来像:

<asp:Repeater runat="server" ID="ParentRepeater" OnItemDataBound="ParentRepeater_ItemDataBound">
    <ItemTemplate>
            // Markup for the three top checkboxes
            <asp:Repeater runat="server" ID="ChildRepeater">
                <ItemTemplate>
                   // Inner layout for each user with checkboxes
                </ItemTemplate>
            </asp:Repeater>
        </div>
    </ItemTemplate>
</asp:Repeater>

在后面的代码中:

protected void ParentRepeater_ItemDataBound(object sender, System.Web.UI.WebControls.RepeaterItemEventArgs e)
{
    RepeaterItem item = e.Item;
    if ((item.ItemType == ListItemType.Item) ||
        (item.ItemType == ListItemType.AlternatingItem))
    {
        var data = item.DataItem as <YourType>;

        Repeater childRepeater = (Repeater)item.FindControl("ChildRepeater");
        childRepeater .DataSource = data.<InnerResults>;
        childRepeater .DataBind();
    }
} 

如果您需要使用匿名类型进行分组,请查看Tuple&lt;,&gt;类。如果您想将item.DataItem强制转换为已知类型,则可以提供帮助。