C# 对象的下拉列表

C# 对象的下拉列表,c#,.net,drop-down-menu,C#,.net,Drop Down Menu,如何从对象绑定DropDownlist DataText或DataValue字段。 当所述对象处于第二级时,例如,要绑定的对象不在返回的对象Users.ContactDetails.Telephone的第一级,因为下面的代码不起作用: ddl.DataSource = dal.dal_Users.GetAllUsers(); ddl.DataTextField = "Telephone"; 我尝试了一系列的想法,但似乎找不到关于是否可以这样做的任何信息。如果您使用的是C#3,那么您可以使用Co

如何从对象绑定DropDownlist DataText或DataValue字段。 当所述对象处于第二级时,例如,要绑定的对象不在返回的对象Users.ContactDetails.Telephone的第一级,因为下面的代码不起作用:

ddl.DataSource = dal.dal_Users.GetAllUsers();
ddl.DataTextField = "Telephone";
我尝试了一系列的想法,但似乎找不到关于是否可以这样做的任何信息。

如果您使用的是C#3,那么您可以使用
ConvertAll
etension方法创建一个新的匿名类型,将内部属性上移到顶层

试着这样做:

IEnumerable<User> users = dal.dal_Users.GetAllUsers();

ddl.DataSource = users.ConvertAll(u => 
    new { Value = u.Name, Telephone = u.ContactDetails.Telephone });
ddl.DataTextField = "Telephone";
IEnumerable users=dal.dal_users.GetAllUsers();
ddl.DataSource=users.ConvertAll(u=>
新{Value=u.Name,Telephone=u.ContactDetails.Telephone});
ddl.DataTextField=“电话”;

编辑:关于这个话题,我得到了足够多的反馈,觉得值得一试

在将域对象绑定到ddl控件时,我采用的一种方法是从contr中有重载的基类继承,以便只允许原始控件的文本/值“子集”。下面的代码用于抽象ddl控件的模型视图演示器或模型视图模型实现,这样您就可以将任何UI推到该业务代码的顶部

下面是我如何将ddl与一组用户对象绑定,并根据相关对象(工作单元)设置所选对象的示例。

这个基类还应该实现ILookupDTO-因为这将迫使您公开本例中用户对象使用的文本和值属性

 public interface ILookupDTO
 {
     string Text {
         get;
         set;
     }
     string Value {
         get;
         set;
     }
 }
下面是在这个答案顶部的bind方法中使用的LookupCollection定义

 public class LookupCollection
 {
     private readonly IEnumerable<ILookupDTO> dtos;
     private ILookupList mList;

     public LookupCollection(IEnumerable<ILookupDTO> dtos)
     {
         this.dtos = dtos;
     }

     public void BindTo(ILookupList list)
     {
         mList = list;

         mList.Clear();

         foreach (ILookupDTO dto in dtos) {
             mList.Add(dto);
         }
     }

     public int SelectedIndex {
         get { return mList.SelectedIndex; }
         set { mList.SelectedIndex = value; }
     }

     public string SelectedValue {
         get { return mList.SelectedValue; }
         set { mList.SelectedValue = value; }
     }
 }
现在,在您的代码隐藏中,您需要在视图的只读属性中执行类似操作

 public interface ILookupList
 {
     void Add(ILookupDTO dto);
     void Clear();
     int Count();
     int SelectedIndex {
         get;
         set;
     }
     string SelectedValue {
         get;
         set;
     }
 }
返回新的WebLookupList(DDL用户)

这里是一个特定于web的ddl的实现

 public class WebLookupList : ILookupList
 {

     private readonly ListControl listControl;

     public WebLookupList(ListControl listControl)
     {
         this.listControl = listControl;
     }

     public void Clear()
     {
         listControl.Items.Clear();
     }

     public void Add(Interfaces.ILookupDTO dto)
     {
         listControl.Items.Add(new ListItem(dto.Text, dto.Value));
     }

     public int Count()
     {
         return listControl.Items.Count;
     }

     public int SelectedIndex {
         get { return listControl.SelectedIndex; }
         set { listControl.SelectedIndex = value; }
     }

     public string SelectedValue {
         get { return listControl.SelectedValue; }
         set { listControl.SelectedValue = value; }
     }
 }
以下是特定于WPF的ddl的实现 如果使用wpf,视图的只读属性看起来像-返回新的WPFLookupList(ddlUsers)

您一次只需要其中一个,但我认为显示这两个将有助于明确我们正在抽象的内容


因为这是一个巨大的答案,我可以发布一个示例项目供下载,如果需要的话,可以显示它的运行情况-让我知道,

我可以看到在.Net 2.0中实现这一点的唯一方法是这样的

  List<Users> userList = dal_Users.GetAllUsers();

  foreach (Users u in userList )
  {
     ListItem li = new ListItem();
     li.Text = u.ContactDetails.Telephone;
     li.Value = u.userID.ToString();
     ddl.Items.Add(li);
  }

  ddl.DataBind();
List userList=dal_Users.GetAllUsers();
foreach(用户列表中的用户u)
{
ListItem li=新的ListItem();
li.Text=u.ContactDetails.phone;
li.Value=u.userID.ToString();
ddl.Items.Add(li);
}
ddl.DataBind();
ConvertAll不是扩展方法,存在于.NET 2.0中。这是列表中的一个方法。Select()如下所述。
 public interface ILookupList
 {
     void Add(ILookupDTO dto);
     void Clear();
     int Count();
     int SelectedIndex {
         get;
         set;
     }
     string SelectedValue {
         get;
         set;
     }
 }
 public class WebLookupList : ILookupList
 {

     private readonly ListControl listControl;

     public WebLookupList(ListControl listControl)
     {
         this.listControl = listControl;
     }

     public void Clear()
     {
         listControl.Items.Clear();
     }

     public void Add(Interfaces.ILookupDTO dto)
     {
         listControl.Items.Add(new ListItem(dto.Text, dto.Value));
     }

     public int Count()
     {
         return listControl.Items.Count;
     }

     public int SelectedIndex {
         get { return listControl.SelectedIndex; }
         set { listControl.SelectedIndex = value; }
     }

     public string SelectedValue {
         get { return listControl.SelectedValue; }
         set { listControl.SelectedValue = value; }
     }
 }
 public class WPFLookupList : ILookupList
 {

     private readonly ComboBox combobox;

     public WPFLookupList(ComboBox combobox)
     {
         this.combobox = combobox;
     }

     public void Add(Interfaces.ILookupDTO dto)
     {
         ComboBoxItem item = new ComboBoxItem();
         item.Content = dto.Text;
         item.Tag = dto.Value;

         combobox.Items.Add(item);
     }

     public void Clear()
     {
         combobox.Items.Clear();
     }

     public int Count()
     {
         return combobox.Items.Count;
     }

     public int SelectedIndex {
         get { return combobox.SelectedIndex; }
         set { combobox.SelectedIndex = value; }
     }

     public string SelectedValue {
         get { return combobox.SelectedValue.Tag; }
         set { combobox.SelectedValue.Tag = value; }
     }
 }
  List<Users> userList = dal_Users.GetAllUsers();

  foreach (Users u in userList )
  {
     ListItem li = new ListItem();
     li.Text = u.ContactDetails.Telephone;
     li.Value = u.userID.ToString();
     ddl.Items.Add(li);
  }

  ddl.DataBind();