有没有办法通过由对象的多个属性组成的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中做我需要的东西)。
答案 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”事件