我的流程应该使用Crystal Reports显示报告,在我的项目中,我使用.NET MVC作为我的框架和数据库模型的实体框架。
问题是我不知道如何将数据集发送到我的报告中,因为我知道水晶报告支持datatable作为他们的数据集,所以我需要将linq结果转换为datatable,这是我的代码到目前为止:
IEnumerable<DataRow> SalesContractEntity = _db.Generate_Report(202, "RGBCtestcontract2");
ReportDocument rd = new ReportDocument();
rd.Load(Server.MapPath("~/Reports/") + "ColdLineBaliHolidayClubENUSD.rpt");
rd.SetDataSource(SalesContractEntity);
CrystalReportViewerID.ReportSource = rd;
注意:
System.Data.Objects.ObjectResult to System.Collections.Generic.IEnumerable
答案 0 :(得分:1)
最后我找到了解决方案
这是我的代码:
List<Generate_Report_Result> ReportList = new List<Generate_Report_Result>();
ReportList = _db.Generate_Report(ApplicantID, ContractNumber).ToList();
DataTable datanya = ToDataTable(ReportList);
ReportDocument rd = new ReportDocument();
string ThePath = Server.MapPath("~/Reports/") + ReportFileName;
rd.Load(ThePath);
rd.SetDataSource(datanya);
CrystalReportViewerID.ReportSource = rd;
CrystalReportViewerID.ToolPanelView = CrystalDecisions.Web.ToolPanelViewType.None;
CrystalReportViewerID.RefreshReport();
private DataTable ToDataTable(List<Generate_Report_Result> items)
{
var tb = new DataTable(typeof(Generate_Report_Result).Name);
PropertyInfo[] props = typeof(Generate_Report_Result).GetProperties(BindingFlags.Public | BindingFlags.Instance);
foreach (var prop in props)
{
tb.Columns.Add(prop.Name, Nullable.GetUnderlyingType(prop.PropertyType) ?? prop.PropertyType);
}
foreach (var item in items)
{
var values = new object[props.Length];
for (var i = 0; i < props.Length; i++)
{
values[i] = props[i].GetValue(item, null);
}
tb.Rows.Add(values);
}
return tb;
}
并且不要忘记在我们的项目文件夹中添加 aspnet_client (您可以从C:\ inetpub \ wwwroot复制)