在MVC报告中动态创建表列存在问题。情况如下。
在我的Report.cs
文件中,我覆盖了OnNeedDataSource()
方法。在其中我创建了System.Data.DataTable
,然后将此DataTable作为DataSource附加到Telerik的表中。
此方法的代码:
/// <summary>
/// Creates DataTable from ReportRecords
/// </summary>
/// <param name="data">List of ReportRecords</param>
/// <returns>DataTable filled with ReportRecord's values</returns>
private System.Data.DataTable CreateDataTable(List<ReportRecord> data)
{
System.Data.DataColumn currentColumn = new System.Data.DataColumn("Current", typeof(int));
System.Data.DataColumn lateColumn = new System.Data.DataColumn("Late", typeof(int));
System.Data.DataColumn foreignColumn = new System.Data.DataColumn("Foreign", typeof(int));
System.Data.DataTable table = new System.Data.DataTable("table");
table.Columns.AddRange(new System.Data.DataColumn[] { currentColumn, lateColumn, foreignColumn });
foreach (ReportRecord reportRecord in data)
{
System.Data.DataRow row = table.NewRow();
row["Current"] = reportRecord.Current;
row["Late"] = reportRecord.Late;
row["Foreign"] = reportRecord.Foreign;
table.Rows.Add(row);
}
return table;
}
/// <summary>
/// Assign DataTable as DataSource of dinamically created table in report
/// </summary>
/// <param name="table">DataTable with data to display</param>
private void AddTableToReport(System.Data.DataTable table)
{
this.tableMain.DataSource = table;
//create two HtmlTextBox items (one for header and one for data) which would be added to the items collection of the table
Telerik.Reporting.TextBox textboxGroup;
Telerik.Reporting.TextBox textBoxTable;
//we do not clear the Rows collection, since we have a details row group and need to create columns only
this.tableMain.ColumnGroups.Clear();
this.tableMain.Body.Columns.Clear();
this.tableMain.Body.Rows.Clear();
int i = 0;
this.tableMain.ColumnHeadersPrintOnEveryPage = true;
foreach (System.Data.DataColumn dc in table.Columns)
{
Telerik.Reporting.TableGroup tableGroup = new Telerik.Reporting.TableGroup();
Telerik.Reporting.TableGroup tableGroup2 = new Telerik.Reporting.TableGroup();
tableGroup.ChildGroups.Add(tableGroup2);
this.tableMain.ColumnGroups.Add(tableGroup);
this.tableMain.Body.Columns.Add(new Telerik.Reporting.TableBodyColumn(Unit.Inch(1)));
textboxGroup = new Telerik.Reporting.TextBox();
textboxGroup.Style.BorderColor.Default = Color.Black;
textboxGroup.Style.BorderStyle.Default = BorderType.Solid;
textboxGroup.Value = dc.ColumnName;
textboxGroup.Size = new SizeU(Unit.Inch(1.1), Unit.Inch(0.3));
tableGroup.ReportItem = textboxGroup;
textBoxTable = new Telerik.Reporting.TextBox();
textBoxTable.Style.BorderColor.Default = Color.Black;
textBoxTable.Style.BorderStyle.Default = BorderType.Solid;
textBoxTable.Value = "=Fields." + dc.ColumnName;
textBoxTable.Size = new SizeU(Unit.Inch(1.1), Unit.Inch(0.3));
this.tableMain.Body.SetCellContent(0, i++, textBoxTable);
this.tableMain.Items.AddRange(new ReportItemBase[] { textBoxTable, textboxGroup });
}
}
但是,结果,我在我的Telerik表格的每一列中从我的DataTable的第一列获得了值:
Current Late Foreign
0 0 0
20 20 20
1 1 1
21 21 21
4 4 4
但值应如下:
Current Late Foreign
0 0 1
20 1 0
1 0 6
21 0 0
4 1 0
为什么会发生这种情况以及如何解决这种情况?
此外:Telerik report showing same data for all columns created dynamically对我不起作用。
答案 0 :(得分:0)
Telerik论坛主题:http://www.telerik.com/forums/mvc-dynamic-columns
简而言之:他们在较新版本的Telerik中更改了某些内容,因此您无法修改OnNeedDataSource
或ItemDataBinding
等事件处理程序中的报表:
报告事件不能用作修改报告定义的地点/时间。自2016年第3季度起,报告项目的任何变更均为&#39;处理阶段事件中的定义不会对结果报告进行有效更改。报表处理开始时,将读取和缓存报表定义属性。在以前的版本中,更改可能会生效,从而导致在事件处理程序执行后处理的所有处理项的输出更改。
Telerik的支持提出了两个选择:
ReportResolver
在我看来,第一个解决方案对于在运行时添加列这么简单的事情来说太复杂了。 第二种解决方案有点难看。
我以第三种方式解决了这种情况:使用所有可能的列创建DataTable和Telerik的表,然后在DataTable中仅填充必要的数据列,然后在Tekerik表中隐藏不必要的列,如此处所述:http://www.telerik.com/forums/need-to-hide-table-column-that-has-no-data