【发布时间】:2013-12-08 20:00:18
【问题描述】:
在 ASP.NET 中,是否有一种干净、简单的方法可以将Dictionary<obj,List<obj2>> 导入到 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