tekerik报告mvc动态列

时间:2017-06-13 07:59:53

标签: c# asp.net-mvc telerik-reporting

在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对我不起作用。

1 个答案:

答案 0 :(得分:0)

Telerik论坛主题:http://www.telerik.com/forums/mvc-dynamic-columns

简而言之:他们在较新版本的Telerik中更改了某些内容,因此您无法修改OnNeedDataSourceItemDataBinding等事件处理程序中的报表:

  

报告事件不能用作修改报告定义的地点/时间。自2016年第3季度起,报告项目的任何变更均为&#39;处理阶段事件中的定义不会对结果报告进行有效更改。报表处理开始时,将读取和缓存报表定义属性。在以前的版本中,更改可能会生效,从而导致在事件处理程序执行后处理的所有处理项的输出更改。

Telerik的支持提出了两个选择:

  1. 提供自定义ReportResolver
  2. 类似于hack的东西,包括生成带有一些特定标记的DataSource。
  3. 在我看来,第一个解决方案对于在运行时添加列这么简单的事情来说太复杂了。 第二种解决方案有点难看。

    我以第三种方式解决了这种情况:使用所有可能的列创建DataTable和Telerik的表,然后在DataTable中仅填充必要的数据列,然后在Tekerik表中隐藏不必要的列,如此处所述:http://www.telerik.com/forums/need-to-hide-table-column-that-has-no-data