Как заполнить BulletedList текстом + LinkButton? - PullRequest
1 голос
/ 31 января 2011

У меня есть этот код, который я использую для заполнения списка BulletedList на моей странице текущими ролями на сайте + некоторая дополнительная информация.

Пока все это связано с текстом, проблем нет.1003 *

Теперь я хотел бы иметь элемент управления LinkButton в конце строки роли, который при нажатии удалит роль (и снова заполнит список) (подобно функциональности, которую имеет инструмент администратора в Visual Studio)

Мой вопрос: есть ли способ сделать это в маркированном списке, или я должен использовать другой элемент управления (например, 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 ]

2 голосов
/ 31 января 2011

Я думаю, вам нужно добавить кнопку ссылки в конце каждой строки, используя которую пользователь может удалить запись.

Для этого вы можете добавить кнопку ссылки в сетку данных и, нажав на событие этой кнопки, вы можете удалить эту конкретную строку.

Вы можете сделать то же самое даже в Repeater вместо datagridview.

1 голос
/ 31 января 2011

После просмотра еще немного:

Краткий ответ: Нет, добавить другой элемент управления внутри BulletedList невозможно. BulletedList s не поддерживают шаблоны.

Если вы хотите, чтобы вся строка роли была HyperLink или LinkButton, вы можете просто установить DisplayMode из BulletedList.

Если вы хотите, чтобы LinkButton появлялся в конце текстовой строки, вам нужно использовать более гибкую структуру списка. Repeater, вероятно, проще всего получить эффект, который вы описываете.


что-то вроде

   <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>

с кодом

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

}
...