【问题标题】:How to populate a BulletedList with text+LinkButton?如何用 text+LinkBut​​ton 填充 BulletedList?
【发布时间】:2019-05-31 22:08:37
【问题描述】:

我有这段代码,用于在我的页面中填充一个 BulletedList,其中包含网站中的当前角色 + 一些额外信息。

到目前为止,由于所有这些都是与文本相关的,所以没问题。

现在我想在角色字符串的末尾有一个 LinkBut​​ton 控件,如果按下它将删除角色(并重新填充列表)(就像 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();    
    }

【问题讨论】:

  • 与之配套的 aspx 文件是什么样的?
  • 什么意思?我只是在页面中拖放了一个项目符号列表,并在后面的代码上写了这个方法。然后我将它包含在 page_load 中。如果这有什么不同的话,该项目就不是 MVC。
  • 啊,好的。我不知道如何使用拖放编辑器来制作 asp.net 页面......(当你保存文件时,它应该写出一些看起来像 HTML 的东西,这是我通常使用的。示例:msdn.microsoft.com/en-us/library/…)

标签: c# asp.net bulletedlist


【解决方案1】:

我认为你必须在每一行的末尾添加链接按钮,使用哪个用户可以删除记录。

为此,您可以在 datagridview 中添加链接按钮,并在该链接按钮的单击事件中删除该特定行。

即使在 Repeater 而不是 datagridview 中,您也可以做同样的事情。

【讨论】:

    【解决方案2】:

    又看了几遍:

    简短回答:不,在 BulletedList 中添加另一个控件是不可能的。 BulletedLists 不支持模板化。

    如果您希望整个角色字符串为HyperLinkLinkButton,您可以简单地设置DisplayMode of the BulletedList

    如果希望 LinkBut​​ton 出现在文本字符串的末尾,则需要使用更灵活的列表结构。 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();
    
    }
    

    【讨论】:

    • 感谢您花时间研究它!我一直在研究Repeater类,但老实说我还没有掌握整个绑定的东西......我看到了一个将对象绑定到转发器的示例,并考虑尝试创建一个具有作为参数的类一个字符串(第一部分)和一个 LinkBut​​ton,然后在中继器上绑定它们的数组!您发布的代码充满了绝对需要的信息。再次感谢。
    • 对于它的价值,您还可以在 &lt;asp:repeater&gt; 代码之外声明 &lt;ul&gt; &lt;/ul&gt; 包装器,而不是将其作为页眉/页脚模板项。
    • @TylerH 你可以。如果我没记错的话,如果列表为空,结果会略有不同 - 如果没有行,则应删除页眉和页脚模板项,但如果您将 &lt;ul&gt; 标签包裹在 @987654335 的外部@,然后一个空列表将导致一个空的&lt;ul&gt;&lt;/ul&gt; 块。根据您想要的结果,您可以使用适当的安排。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-12
    • 1970-01-01
    • 2011-11-05
    • 2017-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多