10

有没有办法通过 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();
}

我想例如不使用“名称”,而是使用“名称(邮编)”,例如。

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

4

3 回答 3

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,所以代码中可能有错误)

于 2009-01-03T19:38:58.907 回答
4

我建议阅读以下内容:http ://martinfowler.com/eaaDev/PresentationModel.html

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

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

于 2009-01-03T19:44:49.363 回答
2

顺便说一句,在分配数据源之前尝试分配“DataTextField”和“DataValueField”。这样做将防止在数据绑定时触发“SelectedIndexChanged”事件......

于 2009-07-13T09:21:16.423 回答