如何在 Telerik 报告中使用具有动态列数的 table 的子报表
How to have a subreport with a table that has a dynamic amount of columns in Telerik reporting
我有一份使用 Telerik 报告制作的报告。此报告在 table 中显示一个月中所有给定工作日(例如 2017 年 7 月的所有星期一)的信息。 table 的列是天数,行是与日期关联的数据。
某一天在一个月内的次数各不相同,因此我需要能够根据请求的数据定义 table 需要的列数。我该怎么做?
这里是它应该如何显示的模拟:
考虑到报告名称是 MainReport
和 SubReport
:
在MainReport
中添加如下代码:
public static ReportSource SetReportSourceForSubreport(object data)
{
var report = new SubReport(data);
var repSource = new InstanceReportSource
{
ReportDocument = report
};
return repSource;
}
现在通过 Visual Studio 报表设计器将子报表添加到主报表并将 ReportSource 设置为 = MyNameSpace.MainReport.SetReportSourceForSubreport(Fields.Data)
。确保 Data
在主报表的数据源中可用。
在您的 SubReport
中,您现在需要一个接受数据的构造函数。首先调用 InitializeComponent()
方法,然后通过代码生成你的 table,添加所需的列数和行数。
public SubReport(object data)
{
InitializeComponent();
// Create and add table to report body
var table = CreateTable(data);
this.detail.Items.Add(table);
}
关于如何通过代码生成table,请阅读以下页面和相关文章以获得详细说明。 https://docs.telerik.com/reporting/table-understanding-cells-rows-columns
关于如何使用代码生成 table 的小示例:
private Table CreateTable(Dictionary<string, IEnumerable<string>> data)
{
////
// New table instance
////
_requiredColumns = data.Count + 1;
Table table = new Table()
{
Name = "tableDay",
Docking = DockingStyle.Fill,
Location = new PointU(Unit.Cm(0D), Unit.Cm(0D)),
Size = new SizeU(Unit.Cm(17D), Unit.Cm(5D)),
RowHeadersPrintOnEveryPage = true
};
table.Bindings.Add(new Telerik.Reporting.Binding("DataSource", "= Fields.Rows"));
for (int i = 0; i < _requiredColumns; i++)
{
table.Body.Columns.Add(new TableBodyColumn(Unit.Cm(_columnWidth)));
}
////
// Add headers
////
table.ColumnGroups.Add(new TableGroup
{
Name = "columnLeftMost",
ReportItem = new TextBox { Name = "textBoxHours", Value = "Hours" }
});
foreach (var item in data)
{
table.ColumnGroups.Add(new TableGroup
{
Name = "column" + item.Key,
ReportItem = new TextBox { Name = "textBoxTitleDay" + item.Key, Value = item.Key }
});
}
////
// Add data rows
////
var tableGroup28 = new TableGroup() { Name = "tableGroup280" };
tableGroup28.Groupings.Add(new Telerik.Reporting.Grouping(null));
table.RowGroups.Add(tableGroup28);
table.Body.Rows.Add(new TableBodyRow(Unit.Cm(ROWHEIGHT)));
List<ReportItemBase> list = new List<ReportItemBase>();
for (int i = 0; i < _requiredColumns; i++)
{
var tb = new TextBox
{
Name = "textBox" + i,
Value = i == 0 ? "= Fields.DayTimeFriendly" : "= Fields.RowValues"
};
list.Add(tb);
table.Body.SetCellContent(0, i, tb);
}
table.Items.AddRange(list.ToArray());
return table;
}
我有一份使用 Telerik 报告制作的报告。此报告在 table 中显示一个月中所有给定工作日(例如 2017 年 7 月的所有星期一)的信息。 table 的列是天数,行是与日期关联的数据。
某一天在一个月内的次数各不相同,因此我需要能够根据请求的数据定义 table 需要的列数。我该怎么做?
这里是它应该如何显示的模拟:
考虑到报告名称是 MainReport
和 SubReport
:
在MainReport
中添加如下代码:
public static ReportSource SetReportSourceForSubreport(object data)
{
var report = new SubReport(data);
var repSource = new InstanceReportSource
{
ReportDocument = report
};
return repSource;
}
现在通过 Visual Studio 报表设计器将子报表添加到主报表并将 ReportSource 设置为 = MyNameSpace.MainReport.SetReportSourceForSubreport(Fields.Data)
。确保 Data
在主报表的数据源中可用。
在您的 SubReport
中,您现在需要一个接受数据的构造函数。首先调用 InitializeComponent()
方法,然后通过代码生成你的 table,添加所需的列数和行数。
public SubReport(object data)
{
InitializeComponent();
// Create and add table to report body
var table = CreateTable(data);
this.detail.Items.Add(table);
}
关于如何通过代码生成table,请阅读以下页面和相关文章以获得详细说明。 https://docs.telerik.com/reporting/table-understanding-cells-rows-columns
关于如何使用代码生成 table 的小示例:
private Table CreateTable(Dictionary<string, IEnumerable<string>> data)
{
////
// New table instance
////
_requiredColumns = data.Count + 1;
Table table = new Table()
{
Name = "tableDay",
Docking = DockingStyle.Fill,
Location = new PointU(Unit.Cm(0D), Unit.Cm(0D)),
Size = new SizeU(Unit.Cm(17D), Unit.Cm(5D)),
RowHeadersPrintOnEveryPage = true
};
table.Bindings.Add(new Telerik.Reporting.Binding("DataSource", "= Fields.Rows"));
for (int i = 0; i < _requiredColumns; i++)
{
table.Body.Columns.Add(new TableBodyColumn(Unit.Cm(_columnWidth)));
}
////
// Add headers
////
table.ColumnGroups.Add(new TableGroup
{
Name = "columnLeftMost",
ReportItem = new TextBox { Name = "textBoxHours", Value = "Hours" }
});
foreach (var item in data)
{
table.ColumnGroups.Add(new TableGroup
{
Name = "column" + item.Key,
ReportItem = new TextBox { Name = "textBoxTitleDay" + item.Key, Value = item.Key }
});
}
////
// Add data rows
////
var tableGroup28 = new TableGroup() { Name = "tableGroup280" };
tableGroup28.Groupings.Add(new Telerik.Reporting.Grouping(null));
table.RowGroups.Add(tableGroup28);
table.Body.Rows.Add(new TableBodyRow(Unit.Cm(ROWHEIGHT)));
List<ReportItemBase> list = new List<ReportItemBase>();
for (int i = 0; i < _requiredColumns; i++)
{
var tb = new TextBox
{
Name = "textBox" + i,
Value = i == 0 ? "= Fields.DayTimeFriendly" : "= Fields.RowValues"
};
list.Add(tb);
table.Body.SetCellContent(0, i, tb);
}
table.Items.AddRange(list.ToArray());
return table;
}