Repeater and add columns to header and itemtemplate on page load

后端 未结 2 1335
轮回少年
轮回少年 2021-01-18 12:03

I haven\'t used repeaters for much more than showing data from a datatable.

I am building a grid that that shows a list of users and columns of roles that the user h

相关标签:
2条回答
  • 2021-01-18 12:47

    Use nested Repeaters: the outer Repeater is for rows and has a HeaderTemplate and ItemTemplate which contain inner Repeaters for header and checkbox columns respectively. Something like this:

    <asp:Repeater runat="server" ID="rowRepeater" OnItemDataBound="rowRepeater_ItemBound">
        <HeaderTemplate>
            <table>                                
            <tr>
                <asp:Repeater runat="server" ID="headerRepeater">
                    <ItemTemplate>
                        <th>
                            <%# Container.DataItem %>
                        </th>
                    </ItemTemplate>
                </asp:Repeater>
            </tr>
        </HeaderTemplate>
        <ItemTemplate>
            <tr>
                <td><asp:Label runat="server" ID="lblUserName" Text='<%# Eval("Key") %>' /></td>
                <asp:Repeater runat="server" ID="columnRepeater">
                    <ItemTemplate>
                        <td>
                            <asp:HiddenField runat="server" ID="hfRoleIndex" Value='<%# Container.ItemIndex %>' />
                            <asp:CheckBox runat="server" ID="cbColumnValue" Checked='<%# Container.DataItem %>' OnCheckedChanged="cbColumnValue_CheckedChanged" AutoPostBack="true" />
                        </td>
                    </ItemTemplate>
                </asp:Repeater>
            </tr>
        </ItemTemplate>
        <FooterTemplate>
            </table>
        </FooterTemplate>
    </asp:Repeater>
    

    and in your code behind:

    Dictionary<string, bool[]> userRoles = new Dictionary<string, bool[]>(){
        {"Bob", new bool[]{true,true,false,false}},
        {"Tim",new bool[]{false,false,true,true}},
        {"John",new bool[]{false,true,false,true}}
    };
    
    string[] headings = { "Rep Name", "Caller", "Closer", "Manager", "SuperUser" };
    
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!Page.IsPostBack)
        {
            rowRepeater.DataSource = userRoles;
            rowRepeater.DataBind();
        }
    }
    
    protected void rowRepeater_ItemBound(object sender, RepeaterItemEventArgs e)
    {
        if (e.Item.ItemType == ListItemType.Header)
        {
            Repeater headerRepeater = e.Item.FindControl("headerRepeater") as Repeater;
            headerRepeater.DataSource = headings;
            headerRepeater.DataBind();
        }
        else if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
        {
            Repeater columnRepeater = e.Item.FindControl("columnRepeater") as Repeater;
            columnRepeater.DataSource = ((KeyValuePair<string, bool[]>)e.Item.DataItem).Value;
            columnRepeater.DataBind();
        }
    }
    
    protected void cbColumnValue_CheckedChanged(object sender, EventArgs e)
    {
        CheckBox cb = sender as CheckBox;
        HiddenField hf = cb.Parent.FindControl("hfRoleIndex") as HiddenField;
        int roleIndex = int.Parse(hf.Value); // now you have the column identifier
    
        Label lbl = cb.Parent.Parent.Parent.FindControl("lblUserName") as Label;
        string userName = lbl.Text; //now you have the row identifier
    
        //now you can update your data source
        userRoles[userName][roleIndex] = cb.Checked;
    }
    
    0 讨论(0)
  • 2021-01-18 12:50

    I'll try something like this:

    <asp:GridView ID="OrdersGV" runat="server" AutoGenerateColumns="False">
    <Columns>
      <asp:BoundField DataField="UserName" />
      <asp:TemplateField>
        <ItemTemplate>
          <asp:ListView ID="NewsLV" runat="server">
            <ItemTemplate>
              <td id="Td1" runat="server" valign="top" style="width: 30px;">
                <asp:Label ID="Label1" runat="server" Text='<%# Eval("RoleName") %>' Visible='<%# Container.DataItemIndex == 0%>'></asp:Label>
                <div style="padding: 2px;">
                  <asp:CheckBox ID="CheckBox1" runat="server" Checked='<%# Eval("IsRoleSelected") %>' />
                </div>
              </td>
            </ItemTemplate>
            <LayoutTemplate>
              <table id="Table1" runat="server" border="0" style="">
                <tr id="itemPlaceholderContainer" runat="server">
                  <td id="itemPlaceholder" runat="server">
                  </td>
                </tr>
              </table>
            </LayoutTemplate>
          </asp:ListView>
        </ItemTemplate>
      </asp:TemplateField>
    </Columns>
    

    0 讨论(0)
提交回复
热议问题