我想知道为什么这不起作用:
是否可以声明性地绑定到Object的属性。
<asp:DropDownList id="ddl" runat="server"
DataValueField="Key"
DataTextField="Value.DisplayName" />
背后的代码
var d = new Dictionary<int, MailAddress>();
d.Add(0,new MailAddress("foo@bar.com", "Mr. Foo");
d.Add(1,new MailAddress("bar@foo.com", "Mr. Bar");
ddl.DataSource = d;
ddl.DataBind(); // Error. It doesn't like "DisplayName"
答案 0 :(得分:3)
看看这篇文章:
将其更改为:
ddl.DataSource = d.Values;
和
DataTextField="DisplayName"
它应该做你期望的事。
答案 1 :(得分:2)
我认为它只是使用反射从您设置为数据源的对象获取属性。您可以使用linq将您的东西包装在KetValuePair对象中
ddl.DataSource = d.Select(r => new KeyValuePair<string, string>(r.Key, r.Value)).ToList();
答案 2 :(得分:0)
如果您使用的是.NET MailAddress类,则可以通过继承MailAddress来创建自己的类,重新创建您需要的构造函数,并重写ToString()方法以返回DisplayName而不是displayName。只使用DataTextField =“Value”应该可以工作。像这样:
public class MyMailAddress : MailAddress
{
public MyMailAddress(string emailAddress, string displayName) : base(emailAddress, displayName)
{
}
public override string ToString()
{
return base.DisplayName;
}
}
如果您控制类MailAddress的代码,您可以覆盖类中的默认ToString()实现并让它返回DisplayName属性,您可以像这样设置DisplayTextField =“Value”:
public class MailAddress
{
public MailAddress(string emailAddress, string displayName)
{
_DisplayName = displayName;
_EmailAddress = emailAddress;
}
public MailAddress()
{
_DisplayName = "";
_EmailAddress = "";
}
private string _DisplayName;
public string DisplayName
{
get { return _DisplayName; }
set { _DisplayName = value; }
}
private string _EmailAddress;
public string EmailAddress
{
get { return _EmailAddress; }
set { _EmailAddress = value; }
}
public override string ToString()
{
return DisplayName;
}
}