将List<string>绑定到asp.net的Grid View列中

4

例子:

<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>

代码:

               DataTable table = new DataTable();
                table.Columns.Add("Name");
                table.Columns.Add("Frequency");
                table.Columns.Add("Reports");

                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();   

当我运行代码时,报表列显示 System.Collections.Generic 而不是字符串值。

Name    Frequency       Reports
A           Daily         System.Collections.Generic.List`1[System.String] 
B           Weekly        System.Collections.Generic.List`1[System.String] 

我需要输出如下内容:报告列应显示字符串列表。
Name    Frequency   Reports
A            Daily            1.XYZ
                          2.ABC
                          3.PQR
B           Weekly            1.XYZ
4个回答

4

那么你应该指定“Reports”列的数据类型:

        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>

感谢您的回答。 report1.Add("1.XYZ"); row1["Reports"] = string.Join("<br />", report1); 我不喜欢在列表中将数字附加到报告名称,并在字符串中添加新行“<br />”。可以将此逻辑添加到设计页面吗? - user2323308
@user2323308,是的,请查看我的更新答案,它将解决你的问题。 - ojlovecd
它返回字符串 System.Collections.Generic.List 结果如下。 名称 频率 报告 A 每日 1. S 2. y - user2323308
你注意到这一行已经改变了吗?table.Columns.Add("Reports", typeof(List<string>)); - ojlovecd
哦...我没注意到。 非常感谢。它起作用了。 - user2323308

1

你可以像这样用逗号分隔显示值

   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);     

你的答案是正确的,我只会将逗号替换为换行符,因为他想在同一行上显示每个报告(在不同行)。 - Abbas

0

您正在尝试在列中显示对象。您的TemplateColumn中的Label不知道如何显示字符串值列表。您应该在Label中放置一个字符串,像这样:

int i = 2;
var res = "1. " + report1.Aggregate((c, n) => c + String.Format("\r\n{0}. {1}", i++, n));
row1["Reports"] = res;

这将会得到预期的结果。


0

GridView无法自动确定如何呈现集合。

您可以在“报告”列中放置另一个数据绑定控件(ListView或GridView),然后在类似于RowDataBound的事件上将其绑定到报告列表。

参考:ASP.NET中的分层数据绑定

      <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>

代码抛出异常:DataBinding: 'System.Char' 不包含名为 'Report' 的属性。 - user2323308
1
:-) 我不是说你应该复制粘贴它以使其起作用。 Report 是您要呈现的列表属性的名称。 - nunespascal
如果您只想要一个字符串列表,只需使用<%# Container.DataItem%> - nunespascal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接