How to populate a BulletedList with text+LinkButton?

3.5k views Asked by At

I have this code that I use to populate a BulletedList in my page with the current roles in the site + some extra information.

So far, since all these are text-related, no problem.

Now I would like to have a LinkButton control at the end of the role string which if pressed it will delete the role (and repopulate the list) (like the functionality that the admin tool in visual studio has)

My question is: Is there a way to do that in a bulleted list, or should I use another control (like a gridview)?

private void BindRolesToList()
    {
        string[] roles = Roles.GetAllRoles();
        string[] data = new string[Roles.GetAllRoles().Count()];

        for (int i = 0; i<roles.Length; i++ )
        {
            data[i] = "Role name: " + roles[i] + ". Number of members in the role: " + Roles.GetUsersInRole(roles[i]).Count() + ".";
        }

        RoleList.DataSource = data;
        RoleList.DataBind();    
    }
2

There are 2 answers

3
Stobor On BEST ANSWER

After looking into it some more:

Short answer: No, adding another control inside a BulletedList is not possible. BulletedLists do not support templating.

If you want the whole role string to be a HyperLink or a LinkButton, you can simply set the DisplayMode of the BulletedList.

If you want the LinkButton to appear at the end of the text string, you need to use a more flexible list structure. Repeater is probably the easiest to get the effect you are describing.


Something like

   <asp:Repeater id="Repeater1" runat="server">
      <HeaderTemplate>
         <ul>
      </HeaderTemplate>

      <ItemTemplate>
         <li>Role name: <%# DataBinder.Eval(Container.DataItem, "RoleName") %>. 
             Number of members in the role: <%# DataBinder.Eval(Container.DataItem, "RoleCount") %>. 
             <asp:LinkButton onCommand="LinkButton_Command" 
                 CommandArgument="<%# DataBinder.Eval(Container.DataItem, "RoleName") %>"
                 />
         </li>
      </ItemTemplate>

      <FooterTemplate>
         </ul>
      </FooterTemplate>

   </asp:Repeater>

with code-behind

private void BindRolesToList()
{
    string[] roles = Roles.GetAllRoles();

    //make a table for the data, with two columns, RoleName and RoleCount
    DataTable data = new DataTable();

    DataColumn column;

    column = New DataColumn();
    column.DataType = System.Type.GetType("System.String");
    column.ColumnName = "RoleName";
    table.Columns.Add(column);

    column = New DataColumn();
    column.DataType = System.Type.GetType("System.Int32");
    column.ColumnName = "RoleCount";
    table.Columns.Add(column);

    // Populate the data
    DataRow row;
    for (int i = 0; i<roles.Length; i++ )
    {
         row = data.NewRow();
         row["RoleName"] = roles[i];
         row["RoleCount"] = Roles.GetUsersInRole(roles[i]).Count();
         data.Rows.Add(row);
    }

    RoleList.DataSource = data;
    RoleList.DataBind();    
}

private void LinkButton_Command(Object sender, CommandEventArgs e) 
{
    string RoleName = e.CommandArgument;

    //whatever code deletes the role, e.g.
    //  Roles.DeleteRole(RoleName);

    BindRolesToList();

}
0
Bhavik Goyal On

I think you have to add the linkbutton at the end of each row, using which user can delete the record.

For this you can add the linkbutton in datagridview and on click event of that linkbutton you can delete that specefic row.

You can do the same thing even in Repeater instead of datagridview.