【问题标题】:Bind dictionary to repeater将字典绑定到中继器
【发布时间】:2011-01-17 12:11:10
【问题描述】:

我有一个字典对象<string, string> 并想将它绑定到转发器。但是,我不确定在 aspx 标记中添加什么来实际显示键值对。没有抛出任何错误,我可以让它与 List 一起工作。如何让字典显示在转发器中?

【问题讨论】:

    标签: c# asp.net data-binding dictionary repeater


    【解决方案1】:

    绑定到字典的值集合。

    myRepeater.DataSource = myDictionary.Values
    myRepeater.DataBind()
    

    【讨论】:

    • 谢谢。我想显示键和值,所以我只使用了myDictionary。在标记中,我使用了<%# Container.DataItem.ToString() %>。这是可行的,但它将键和值都显示为一个“项目”。有没有办法单独获取keyvalue,以便它们可以分别格式化?
    • 是的。字典中的对象是 KeyValuePairs,因此您可以按照 Joe 在他的答案中显示的那样转换 DataItem。
    【解决方案2】:

    IDictionary<TKey,TValue> 也是 ICollection<KeyValuePair<TKey, TValue>>

    您需要绑定到类似(未经测试):

    ((KeyValuePair<string,string>)Container.DataItem).Key
    ((KeyValuePair<string,string>)Container.DataItem).Value
    

    请注意,返回项目的顺序是未定义的。对于小型词典,它们很可能按插入顺序返回,但这不能保证。如果您需要有保证的订单,SortedDictionary&lt;TKey, TValue&gt; 按关键字排序。

    或者,如果您需要不同的排序顺序(例如按值),您可以为您的键值对创建一个 List&lt;KeyValuePair&lt;string,string&gt;&gt;,然后对其进行排序,并绑定到排序列表。

    回答: 我在标记中使用此代码分别显示键和值:

    <%# DataBinder.Eval((System.Collections.Generic.KeyValuePair<string, string>)Container.DataItem,"Key") %>
    <%# DataBinder.Eval((System.Collections.Generic.KeyValuePair<string, string>)Container.DataItem,"Value") %>
    

    【讨论】:

    • 有没有办法按一定的顺序退货?在我的(非常短的测试)4 项列表中,它们按照放置的顺序返回。
    【解决方案3】:

    &lt;%# Eval("key")%&gt; 为我工作。

    【讨论】:

    • 效果很好!: 和
    • Except... 我发现使用 返回小写值。因此,需要保留键的字体大小写,我不得不坚持使用 List>.
    【解决方案4】:

    在绑定字典中的条目类型的代码隐藏中编写一个属性。比如说,我将Dictionary&lt;Person, int&gt; 绑定到我的中继器。我会(在 C# 中)在我的代码隐藏中编写这样的属性:

    protected KeyValuePair<Person, int> Item
    {
        get { return (KeyValuePair<Person, int>)this.GetDataItem(); }
    }
    

    然后,在我看来,我可以使用这样的代码段:

    <span><%# this.Item.Key.FirstName %></span>
    <span><%# this.Item.Key.LastName %></span>
    <span><%# this.Item.Value %></span>
    

    这使得标记更加清晰。虽然我希望引用的值使用较少通用的名称,但我知道 Item.KeyPersonItem.Valueint 并且它们是强类型的。

    您当然可以(阅读:应该)将Item 重命名为更能象征您的字典中的条目。在我的示例用法中,仅此一项就有助于减少命名中的任何歧义。

    当然没有什么可以阻止你定义一个额外的属性,像这样说:

    protected Person CurrentPerson
    {
        get { return ((KeyValuePair<Person, int>)this.GetDataItem()).Key; }
    }
    

    并因此在您的标记中使用它:

    <span><%# this.CurrentPerson.FirstName %></span>
    

    ...这些都不会阻止您访问相应字典条目的.Value

    【讨论】:

      猜你喜欢
      • 2014-03-30
      • 2019-02-26
      • 1970-01-01
      • 2012-05-09
      • 2017-08-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多