【问题标题】:Bind List<string> to a column of Grid View in asp.net将 List<string> 绑定到 asp.net 中的 Grid View 的一列
【发布时间】:2013-06-23 07:50:05
【问题描述】:

例子:

<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

【问题讨论】:

    标签: c# asp.net gridview datatable


    【解决方案1】:

    然后你需要指定报告列的数据类型:

            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>
    

    【讨论】:

    • 感谢您的回答。报告1.Add("1.XYZ"); row1["报告"] = string.Join("
      ", report1);我不喜欢将数字附加到列表中的报告名称并在字符串中添加新行“
      ”。加入代码文件。我们可以将此逻辑添加到设计器页面吗?
    • @user2323308 是的,看我更新的答案,它会解决你的问题。
    • 返回字符串 System.Collections.Generic.List 结果是这样的。名称 频率 报告 A 每日 1. S 2.y
    • 你注意到这条线已经改变了吗? table.Columns.Add("报告", typeof(List));
    • 哦...我没注意到。非常感谢你。它奏效了。
    【解决方案2】:

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

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

    【讨论】:

    • 你的答案是正确的,我只会用换行符替换逗号,因为他试图在换行符上显示每个报告(在同一行中)。
    【解决方案3】:

    您正试图在列中显示对象。 TemplateColumn 中的标签不知道如何显示字符串值列表。您应该在标签中放置一个字符串,如下所示:

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

    这将给出预期的结果。

    【讨论】:

      【解决方案4】:

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

      您可以将另一个数据绑定控件(ListView 或 GridView)放在 Reports 列中,然后将其绑定到 RowDataBound 等事件的报告列表中。

      参考:Hierarchical Data Binding in 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”的属性。
      • :-) 我没说,你应该复制粘贴它才能工作。 Report 是您要呈现的列表中的属性名称。
      • 如果你只想要一个字符串列表,只需使用&lt;%# Container.DataItem %&gt;
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-12-07
      • 1970-01-01
      • 2014-01-31
      • 1970-01-01
      • 1970-01-01
      • 2014-06-03
      • 2013-05-03
      相关资源
      最近更新 更多