2011-12-02 47 views
0

存储过程的结果如下所示。Repeater中的数据格式

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

我会使用一个嵌套的中继器。

使用Linq,您可以轻松地将数据分组并将其绑定到外部中继器(并设置3个顶端复选框的值),然后外部中继器的OnDataBound可以将用户列表设置为嵌套中继器的数据源。

标记看起来像:

<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(); 
    } 
} 

如果需要使用匿名类型的分组看看元组<,>类。如果你想将item.DataItem转换回已知类型,这可以提供帮助。

+0

我可以得到标记吗? – Rauf

+0

var data = item.DataItem as DataTable; Repeater childRepeater =(Repeater)item.FindControl(“ChildRepeater”); string filterExp =“RoleId =”+ roleID; DataRow [] dtChild = data.Select(filterExp); childRepeater.DataSource = dtChild; childRepeater.DataBind();'它不起作用。我得到'数据'为空。 – Rauf

+0

什么是DateItem的类型?如果它不是数据表,则'as'操作符将返回空值 –