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>