【问题标题】:Bind a Dictionary<K,V> to a DropDownList将 Dictionary<K,V> 绑定到 DropDownList
【发布时间】:2010-09-29 20:20:25
【问题描述】:

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

是否可以以声明方式绑定到对象的属性。

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

【问题讨论】:

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


    【解决方案1】:

    看看这篇文章:

    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"
    

    它应该能满足你的期望。

    【讨论】:

    • 那么我不会失去 Binding DataValueField to Key 吗?
    • 已确认。我会失去绑定密钥的能力。
    • key不是value的属性吗?
    • 不,示例绑定到字典的键。 System.Net.MailAddress 没有 Key 属性。但是,该链接很有用。
    【解决方案2】:

    我认为它只是使用反射从您设置为数据源的对象中获取属性。您可以使用 linq 将您的东西包装在 KetValuePair 对象中

    ddl.DataSource = d.Select(r => new KeyValuePair<string, string>(r.Key, r.Value)).ToList();
    

    【讨论】:

    • 这实际上会起作用……只需稍作改动。显然将 DropDownList DataTextField 更改为 Value 并将您的代码更改为:...Select(r =&gt; new KeyValuePair&lt;string, string&gt;(r.Key.ToString(), r.Value.DisplayName)); 您也不需要 ToList();
    • 你的权利......我使用 Dictionary 快速完成了示例,忘记进行必要的修改。 @leppie 感谢您的精彩和建设性的评论。您想详细说明吗?
    【解决方案3】:

    如果您使用 .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;
        }
    }
    

    【讨论】:

    • 我正在考虑这个......但我正在使用System.Net.MailAddress 类。我不相信我可以覆盖它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-26
    相关资源
    最近更新 更多