C# 绑定列表<;字符串>;到asp.net中的网格视图列
例如:C# 绑定列表<;字符串>;到asp.net中的网格视图列,c#,asp.net,gridview,datatable,C#,Asp.net,Gridview,Datatable,例如: <asp:GridView ID="reportScheduleDetailsGridView" runat="server" AutoGenerateColumns="False" > <Columns> <asp:BoundField DataField="Name" HeaderText="Name" ></asp:BoundField
<asp:GridView ID="reportScheduleDetailsGridView" runat="server" AutoGenerateColumns="False" >
<Columns>
<asp:BoundField DataField="Name" HeaderText="Name" ></asp:BoundField>
<asp:BoundField DataField="Frequency" HeaderText="Frequency" ></asp:BoundField>
<asp:TemplateField HeaderText="Reports" >
<ItemTemplate>
<asp:Label ID="cblSubscribedReports" Text='<%# Eval("Reports") %>' runat="server"/>
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
我需要这样的输出:Report列应该显示字符串列表
Name Frequency Reports
A Daily 1.XYZ
2.ABC
3.PQR
B Weekly 1.XYZ
您可以这样显示逗号分隔的值
DataRow row2 = table.NewRow();
row2["Name"] = "B";
row2["Frequency"] = "Weekly";
List<string> report2 = new List<string>();
report2.Add("XYZ");
string strReports = string.Join(",", report2.ToArray());
row2["Reports"] = strReports ;
table.Rows.Add(row2);
datarow2=table.NewRow();
第2行[“名称”]=“B”;
第2行[“频率”]=“每周”;
List report2=新列表();
报告2.添加(“XYZ”);
string strReports=string.Join(“,”,report2.ToArray());
第2行[“报告”]=报表;
table.Rows.Add(第2行);
您试图在列中显示对象。TemplateColumn中的标签不知道如何显示字符串值列表。您应该在标签中放置一个字符串,如下所示:
int i = 2;
var res = "1. " + report1.Aggregate((c, n) => c + String.Format("\r\n{0}. {1}", i++, n));
row1["Reports"] = res;
这将给出预期的结果。GridView无法自动确定如何显示集合 您可以在Reports列中放置另一个数据绑定控件(ListView或GridView),然后将其绑定到RowDataBound之类事件的报告列表 参考:
然后您应该指定报告列的数据类型:
DataTable table = new DataTable();
table.Columns.Add("Name");
table.Columns.Add("Frequency");
table.Columns.Add("Reports", typeof(List<string>));
DataRow row1 = table.NewRow();
row1["Name"] = "A";
row1["Frequency"] = "Daily";
List<string> report1 = new List<string>();
report1.Add("XYZ");
report1.Add("ABC");
report1.Add("PQR");
row1["Reports"] = report1;
table.Rows.Add(row1);
DataRow row2 = table.NewRow();
row2["Name"] = "B";
row2["Frequency"] = "Weekly";
List<string> report2 = new List<string>();
report2.Add("XYZ");
row2["Reports"] = report2;
table.Rows.Add(row2);
reportScheduleDetailsGridView.DataSource = table;
reportScheduleDetailsGridView.DataBind();
<asp:GridView ID="reportScheduleDetailsGridView" runat="server" AutoGenerateColumns="False">
<Columns>
<asp:BoundField DataField="Name" HeaderText="Name"></asp:BoundField>
<asp:BoundField DataField="Frequency" HeaderText="Frequency"></asp:BoundField>
<asp:TemplateField HeaderText="Reports">
<ItemTemplate>
<asp:Repeater ID="Repeater1" runat="server" DataSource='<%# Eval("Reports") %>'>
<ItemTemplate>
<%# (Container.ItemIndex+1)+"."+ Container.DataItem %><br />
</ItemTemplate>
</asp:Repeater>
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
DataTable=newdatatable();
表.列.添加(“名称”);
表.列.添加(“频率”);
表.列.添加(“报告”,类型(列表));
DataRow row1=table.NewRow();
第1行[“名称”]=“A”;
第1行[“频率”]=“每日”;
List report1=新列表();
报告1.添加(“XYZ”);
报告1.添加(“ABC”);
报告1.添加(“PQR”);
第1行[“报告”]=报告1;
table.Rows.Add(第1行);
DataRow row2=table.NewRow();
第2行[“名称”]=“B”;
第2行[“频率”]=“每周”;
List report2=新列表();
报告2.添加(“XYZ”);
第2行[“报告”]=报告2;
table.Rows.Add(第2行);
reportScheduleDetailsGridView.DataSource=表;
reportScheduleDetailsGridView.DataBind();
您的答案是正确的,我只会用换行符替换逗号,因为他试图在换行符(在同一行)上显示每个报表。代码引发异常:数据绑定:“System.Char”不包含名为“report”的属性:-)我没有说,您应该复制粘贴它以使其正常工作Report
是要呈现的列表中属性的名称。如果只需要字符串列表,请使用
谢谢您的回答。报告1.添加(“1.XYZ”);行1[“Reports”]=string.Join(“”,report1);我不想将数字附加到列表中的报告名称,并在字符串中添加新行“
”。加入代码文件。我们可以将此逻辑添加到设计器页面吗?@user2323308是的,请参阅我的更新答案,它将解决您的问题。它返回字符串System.Collections.Generic.List结果如下。姓名频率每天报告1次。你注意到这条线变了吗?表.列.添加(“报告”,类型(列表));哦我没有注意到。多谢各位。成功了。
int i = 2;
var res = "1. " + report1.Aggregate((c, n) => c + String.Format("\r\n{0}. {1}", i++, n));
row1["Reports"] = res;
<ItemTemplate>
<asp:Repeater Runat="server" EnableViewState="false"
DataSource='<%# DataBinder.Eval(Container.DataItem, "Reports")%>'>
<ItemTemplate>
<br/><asp:Label ID="cblSubscribedReports"
Text='<%# DataBinder.Eval(Container.DataItem, "Report") %>'/>
</ItemTemplate>
</asp:Repeater>
</ItemTemplate>
DataTable table = new DataTable();
table.Columns.Add("Name");
table.Columns.Add("Frequency");
table.Columns.Add("Reports", typeof(List<string>));
DataRow row1 = table.NewRow();
row1["Name"] = "A";
row1["Frequency"] = "Daily";
List<string> report1 = new List<string>();
report1.Add("XYZ");
report1.Add("ABC");
report1.Add("PQR");
row1["Reports"] = report1;
table.Rows.Add(row1);
DataRow row2 = table.NewRow();
row2["Name"] = "B";
row2["Frequency"] = "Weekly";
List<string> report2 = new List<string>();
report2.Add("XYZ");
row2["Reports"] = report2;
table.Rows.Add(row2);
reportScheduleDetailsGridView.DataSource = table;
reportScheduleDetailsGridView.DataBind();
<asp:GridView ID="reportScheduleDetailsGridView" runat="server" AutoGenerateColumns="False">
<Columns>
<asp:BoundField DataField="Name" HeaderText="Name"></asp:BoundField>
<asp:BoundField DataField="Frequency" HeaderText="Frequency"></asp:BoundField>
<asp:TemplateField HeaderText="Reports">
<ItemTemplate>
<asp:Repeater ID="Repeater1" runat="server" DataSource='<%# Eval("Reports") %>'>
<ItemTemplate>
<%# (Container.ItemIndex+1)+"."+ Container.DataItem %><br />
</ItemTemplate>
</asp:Repeater>
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>