List of <string> bindings to the Grid View column in asp.net
Example:
<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> code:
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(); When I run the code The Reports column displays System.Collections.Generic instead of string values
Name Frequency Reports A Daily System.Collections.Generic.List`1[System.String] B Weekly System.Collections.Generic.List`1[System.String] I need the output as follows: a list of rows should be displayed in the report column
Name Frequency Reports A Daily 1.XYZ 2.ABC 3.PQR B Weekly 1.XYZ Then you can specify the data type of the Reports column:
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> you can show a comma value similar to this
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); You are trying to show an object in a column. A label in TemplateColumn does not know how to display a list of string values. You should put the string in a shortcut, for example:
int i = 2; var res = "1. " + report1.Aggregate((c, n) => c + String.Format("\r\n{0}. {1}", i++, n)); row1["Reports"] = res; This will give the expected result.
GridView cannot automatically determine how to present a collection.
In the Reports column, you can place another data binding control (ListView or GridView), and then bind it to an event report list, such as RowDataBound.
Refer: Binding Hierarchical Data 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>