【问题标题】:How to populate a DropDownList using a List<ListItem>如何使用 List<ListItem> 填充 DropDownList
【发布时间】:2011-02-01 16:04:24
【问题描述】:

我有一个下拉列表。

我需要用List&lt;ListItem&gt; 中收集的项目填充它。

在我的脚本中,收集器已正确填充。

但我无法填充 DropDownList。我收到一个错误:

DataBinding: 'System.Web.UI.WebControls.ListItem' does not contain a property with the name 'UserName'."}

<asp:DropDownList ID="uxListUsers" runat="server" DataTextField="UserName" 
DataValueField="UserId">

List<ListItem> myListUsersInRoles = new List<ListItem>();
foreach (aspnet_Users myUser in context.aspnet_Users)
{
    // Use of navigation Property EntitySet
    if (myUser.aspnet_Roles.Any(r => r.RoleName == "CMS-AUTHOR" || r.RoleName == "CMS-EDITOR"))
        myListUsersInRoles.Add(new ListItem(myUser.UserName.ToString(), myUser.UserId.ToString()));
}
uxListUsers.DataSource = myListUsersInRoles; // MAYBE PROBLEM HERE????
uxListUsers.DataBind();

有什么想法吗?谢谢

【问题讨论】:

    标签: c# asp.net


    【解决方案1】:

    当您初始化 listItem 对象时,您实际上是在初始化属性(文本、值)

    EX ( new ListItem(myUser.User (Text PROPERTY), myUser.UserId.ToString() (Value PROPERTY) )
    

    尝试将其与

    绑定
        <asp:DropDownList ID="uxListUsers" runat="server" DataTextField="Text" 
    DataValueField="Value">    
    

    下拉菜单将采用存储在 ListItem 对象中的文本和值属性

    并在用户界面中显示

    【讨论】:

      【解决方案2】:

      您似乎绑定到 ListItem 对象列表,这些对象不公开 UserName 或 UserId 属性。只需清除这些属性(DataTextField 和 DataValueField)就可以了。

      或者更好的是,只需将您创建的列表项直接添加到下拉列表中并跳过绑定。

      【讨论】:

        【解决方案3】:

        正如错误所说,System.Web.UI.WebControls.ListItem 没有 UserName 成员。它确实有 Text 和 Value 成员。试试下面的

        <asp:DropDownList ID="uxListUsers" runat="server" DataTextField="Text" DataValueField="Value">
        

        【讨论】:

          【解决方案4】:

          它很简单,只需使用ListItemCollection 而不是通用列表List 在这里

          改变你的第一行

          <asp:DropDownList ID="uxListUsers" runat="server">
          
          ListItemCollection myListUsersInRoles = new ListItemCollection();
                  foreach (aspnet_Users myUser in context.aspnet_Users)
                  {
                      // Use of navigation Property EntitySet
                      if (myUser.aspnet_Roles.Any(r => r.RoleName == "CMS-AUTHOR" || r.RoleName == "CMS-EDITOR"))
                          myListUsersInRoles.Add(new ListItem(myUser.UserName.ToString(), myUser.UserId.ToString()));
                  }
                  uxListUsers.DataSource = myListUsersInRoles; // MAYBE PROBLEM HERE????
                  uxListUsers.DataBind();
          

          【讨论】:

          • 这解决了我的问题 跨度>
          【解决方案5】:

          不要将ListItems 绑定到列表,只需添加它们即可。绑定是一种使用ListControl 的内置函数将对象转换为ListItems 的方法。由于您已经完成了转换,请为您自己和服务器节省一些工作并使用ClearItems.AddRange 而不是DataSourceDataBind

          uxListUsers.Clear();
          uxListUsers.Items.AddRange(myListUsersInRoles;)
          

          您还需要从 aspx 中删除绑定指令:

          <asp:DropDownList ID="uxListUsers" runat="server" />
          

          【讨论】:

          • 你为什么不使用 ListItemCollection 来代替?
          • 我的意思是,你为什么忽略 ListItemCollection?并且(更喜欢或)使用泛型 List 并且对 uxListUsers.Clear() 感到头疼; (删除项目)
          • @Waqas Raja 有很多不同的方法可以解决这个问题。更改为 ListItemCollection 既不会减少代码行数,也不会提高代码清晰度,所以我不确定为什么应该首选它而不是简单地作为替代方案。 OP 的另一种可能更容易(更改的代码行更少)的方法是简单地将用户添加到 myListUsersInRoles 并让 DataBindListItems 进行处理(例如 myListUsersInRoles.Add(myUser);)。我也可以想到其他几种方法来解决它,但我不知道其中任何一种更可取。
          • 顾名思义,ListItem Collection,你很适合使用通用列表来生成清晰的代码。欢呼
          【解决方案6】:

          通用列表中没有用户名和用户 ID。如果命名很重要,最好的办法是创建一个对象,其中包含您需要绑定的两个字段,而不是绑定到 ListItem。如果必须绑定到 ListItem,请将 Value 和 Text 视为绑定点。

          【讨论】:

            【解决方案7】:

            可能是使用反射的最简单方法

            uxListUsers.DataSource = typeof(ListItem).GetProperties();
            uxListUsers.DataTextField = "Name"; //This is name of property enumerable typeof(ListItem).GetProperties().AsEnumerable().Select(p => new { p.Name }) 
            uxListUsers.DataBind();
            

            【讨论】:

              【解决方案8】:
              ListItem LI = new ListItem();
              LI.Value = Convert.ToString("value");
              LI.Text = Convert.ToString("text");
              DrpDwnlist.Items.Add(LI);
              

              【讨论】:

                猜你喜欢
                • 2011-09-25
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2015-08-22
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多