【问题标题】:Dictionary<obj,List<obj>> into GridView Datasource?Dictionary<obj,List<obj>> 到 GridView 数据源?
【发布时间】:2013-12-08 20:00:18
【问题描述】:

在 ASP.NET 中,是否有一种干净、简单的方法可以将Dictionary&lt;obj,List&lt;obj2&gt;&gt; 导入到 GridView 数据源中?如果我只是将字典按原样放入 GridView 并执行Eval("Key")Eval("Value"),我将在Eval("Value") 列中得到对象名称。我正在寻找在Eval("Value") 字段中提供逗号分隔值的解决方案。

网格视图:

<SharePoint:SPGridView
    id="GvItems"
    runat="server"
    AutoGenerateColumns="false"
    width="100%"
    AllowSorting="True" OnRowDataBound="GvItems_OnRowDataBound" >
<AlternatingRowStyle CssClass="ms-alternatingstrong" />
<Columns>
    <asp:TemplateField ItemStyle-CssClass="ms-cbp" HeaderStyle-CssClass="ms-cbp" ItemStyle-VerticalAlign="Top">
        <HeaderTemplate>
            <asp:CheckBox ID="chkBoxSL" 
                runat="server"
                AutoPostBack="true"
                OnCheckedChanged="chkBoxSL_CheckedChanged"
                style="margin-top:-1px; margin-bottom:-1px;" />
        </HeaderTemplate>
        <ItemTemplate>
            <asp:CheckBox ID="chkId" 
                runat="server" 
                class="padding-right: 15px;padding-top: 0px;padding-bottom: 0px" />
        </ItemTemplate>
    </asp:TemplateField>
    <asp:TemplateField HeaderText="Web Application Zone" HeaderStyle-Width="50%" HeaderStyle-CssClass="ms-vh2-nofilter-perm" SortExpression="Key">
        <ItemTemplate>
            <asp:Label ID="lblZone" runat="server" Text='<%# Eval("Key") %>' />
        </ItemTemplate>
    </asp:TemplateField>
    <asp:TemplateField HeaderText="Crawl Target" HeaderStyle-Width="50%" HeaderStyle-CssClass="ms-vh2-nofilter-perm" SortExpression="Value">
        <ItemTemplate>
            <asp:Label ID="lblServer" runat="server" Text='<%#Eval("Value") %>' />          
        </ItemTemplate>
    </asp:TemplateField>

</Columns>

代码隐藏:

{
//...
var sds = new Dictionary<SPUrlZone, List<Uri>>();

foreach (var t in webApp.SiteDataServers)
{
    var uriList = new List<Uri>();
    foreach (var v in t.Value)
       {
           uriList.Add(v);
       }

   sds.Add(t.Key, uriList);
}
//...
GvItems.DataSource = sds;
GvItems.DataBind();
}
    protected void GvItems_OnRowDataBound(object sender, GridViewRowEventArgs e)
    {
        if (e.Row.DataItem != null)
        {
            Label label = (Label)e.Row.FindControl("lblServer");

            // extract list items

            string[] uris = ((KeyValuePair<SPUrlZone, List<Uri>>)e.Row.DataItem).Value.Select(x => x.ToString()).ToArray();
            label.Text = string.Join(",", uris);
        }
    }

【问题讨论】:

  • 在网格中,列表项应该用逗号分隔,例如“项目 1,项目 2”。
  • 您能否提供最少的代码来显示您的场景并导致下面提到的异常?
  • 不能是GvItems_OnRowDataBound事件中的KeyValuePair,它必须匹配数据源,即必须是KeyValuePair。这就是您看到 InvalidCastException 的原因。调试器是你的朋友 ;)
  • 是的,谢谢(哎呀)。但是,现在所有的行都具有相同的值,但值与键不匹配。例如。 Row1 应该是 Key1 和“Value1”,Row2 和 Key2,“Value2”,Row3 和 Key3,“Value3,Value4”。相反,每一行都有“Value1,Value2,Value3,Value4”。
  • 忽略,这是由于 uriList 对象的范围问题。

标签: c# asp.net gridview dictionary


【解决方案1】:

查看 MSDN http://msdn.microsoft.com/en-us/library/4hx47hfe%28v=vs.110%29.aspx。目前您只访问 List,这就是为什么它没有按您想要的方式进行评估的原因。或者,您可以在代码隐藏中编写一个方法并手动执行 - 我个人更喜欢这种方式。

我给你做了个小例子:

标记

 <asp:GridView runat="server" ID="grid1">
            <Columns>
                <asp:BoundField HeaderText="Key" DataField="Key"></asp:BoundField>
                <asp:TemplateField HeaderText="Value">
                    <ItemTemplate>
                        <asp:Label ID="Label1" runat="server" />
                    </ItemTemplate>
                </asp:TemplateField>
            </Columns>
        </asp:GridView>

背后的代码

protected void Page_Load(object sender, EventArgs e)
    {
        Dictionary<string, List<Person>> data = new Dictionary<string, List<Person>>();
        data.Add("Managers", new List<Person>() { new Person() { Age = 38, Name = "Bob" }, new Person() { Age = 45, Name = "Stephen" } });
        data.Add("Developers", new List<Person>() { new Person() { Age = 25, Name = "Jake" }, new Person() { Age = 31, Name = "John" }, new Person() { Age = 27, Name = "Matthew" } });

        grid1.RowDataBound += grid1_RowDataBound;
        grid1.DataSource = data;
        grid1.DataBind();
    }

    void grid1_RowDataBound(object sender, GridViewRowEventArgs e)
    {
        if (e.Row.DataItem != null)
        {
            Label label = (Label)e.Row.FindControl("Label1");

            // extract list items
            string[] names = ((KeyValuePair<string, List<Person>>) e.Row.DataItem).Value.Select(x => x.Name).ToArray();
            label.Text = string.Join(",", names);
        }
    }

    protected class Person
    {
        public int Age { get; set; }
        public string Name { get; set; }
    }

或者您可以绑定从一开始就以逗号分隔的值...取决于您的场景。

【讨论】:

  • 我喜欢它,但我得到了一个 InvalidCastException。 string[] uris = ((KeyValuePair&lt;string, List&lt;Uri&gt;&gt;)e.Row.DataItem).Value.Select(x =&gt; x.ToString()).ToArray(); 此外,在 DataItem 上,我看到了每一行 Uri 值,而不仅仅是数据绑定行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-16
  • 1970-01-01
  • 2021-02-03
  • 2010-11-18
相关资源
最近更新 更多