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();
}
After looking into it some more:
Short answer: No, adding another control inside a BulletedList
is not possible. BulletedList
s 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();
}