Привязать словарьв DropDownList - PullRequest
0 голосов
/ 30 сентября 2010

Мне было интересно, почему это не работает:

Возможно ли декларативное связывание со свойством объекта.

<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 ]

3 голосов
/ 30 сентября 2010

Проверьте это сообщение:

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"

И он должен делать то, что вы ожидаете.

2 голосов
/ 30 сентября 2010

Я думаю, что он просто использует отражение, чтобы получить свойство от объекта, который вы указали в качестве источника данных. Вы можете использовать linq, чтобы обернуть ваши вещи в объекты KetValuePair

ddl.DataSource = d.Select(r => new KeyValuePair<string, string>(r.Key, r.Value)).ToList();
0 голосов
/ 30 сентября 2010

Если вы используете класс .NET MailAddress, вы можете создать свой собственный класс, унаследовав его от MailAddress, воссоздав нужные вам конструкторы и переопределив метод ToString () для возврата DisplayName вместо displayName. Только использование DataTextField = "Значение" должно работать. Как это:

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