dropdownlist DataTextField由属性组成?

时间:2009-01-03 19:34:28

标签: c# asp.net data-binding drop-down-menu

有没有办法通过由对象的多个属性组成的c#在asp.net中创建下拉列表的datatextfield属性?

public class MyObject
{
  public int Id { get; set; }
  public string Name { get; set; }
  public string FunkyValue { get; set; }
  public int Zip { get; set; }
}

protected void Page_Load(object sender, EventArgs e)
{
  List<MyObject> myList = getObjects();
  ddList.DataSource = myList;
  ddList.DataValueField = "Id";
  ddList.DataTextField = "Name";
  ddList.DataBind();
}

我想要,例如不要使用“名称”,而是“名称(Zip)”,例如

当然,我可以更改MyObject类,但我不想这样做(因为MyObject类在模型类中,不应该在UI中做我需要的东西)。

3 个答案:

答案 0 :(得分:22)

将另一个属性添加到MyObject类并绑定到该属性:

public string DisplayValue
{
 get { return string.Format("{0} ({1})", Name, Zip); }
}

或者如果您无法修改MyObject,请在表示层中创建一个包装器对象(仅用于显示)。这也可以使用一些LINQ来完成:

List<MyObject> myList = getObjects();
ddList.DataSource = (from obj in myList
                    select new
                    {
                      Id = obj.Id,
                      Name = string.Format("{0} ({1})", obj.Name, obj.Zip)
                    }).ToList();
ddList.DataValueField = "Id";
ddList.DataTextField = "Name";
ddList.DataBind();

(抱歉,我没有Visual Studio,因此代码中可能存在错误)

答案 1 :(得分:4)

我建议您阅读:http://martinfowler.com/eaaDev/PresentationModel.html

基本上,您希望创建一个表示绑定到特定UI的类。因此,您可以将Model(示例中的My Object)映射到ViewModel对象,然后以这种方式绑定下拉列表。这是考虑分离问题的一种很酷的方式。

编辑:这是关于ViewModel的另一个博客系列:http://blogs.msdn.com/dancre/archive/2006/10/11/datamodel-view-viewmodel-pattern-series.aspx

答案 2 :(得分:2)

顺便说一句, 在分配DataSource之前,请尝试分配“DataTextField”和“DataValueField”。这样做会阻止在数据绑定...

时触发“SelectedIndexChanged”事件