将字典<k,v>绑定到DropDownList </k,v>

时间:2010-09-29 20:20:25

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

我想知道为什么这不起作用:

是否可以声明性地绑定到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"

3 个答案:

答案 0 :(得分:3)

看看这篇文章:

http://blogs.msdn.com/b/piyush/archive/2006/10/17/how-to-bind-generic-dictionary-with-dropdown-list.aspx

将其更改为:

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;
    }
}