数据打印

开发工具与关键技术:MVC
作者:胡名权
撰写时间:2019年6月23日

很多时候我们常常会遇到打印本页数据、打印全部数据的情况,那么这次我们就来说说牙打印水晶报表吧。那就废话不多话,我们直接进入代码步骤的学习探讨吧。
首先我们先在控制器写要打印的全部数据的查询代码,先把数据查询查来才能打印不是吗?
也就是多表的连接查询,绑定字段,返回值。
Var listAchievement = from tbAchiement in TbAchievment
join tbStudent in myModel.PW_Student on tbAchiement.UserID
equals tbStudent.UserID
join tbClass in myModel.SYS_Class on tbStudent.ClassID
equals tbClass.ClassID
elect new AchievementInfor
{
StudentName = tbStudent.StudentName,
StudentNumber = tbStudent.StudentNumber,
StudentSex = tbStudent.StudentSex,
} ;
就不一一写出来了,写一两个表示,列举出来它的步骤方法。

DataTable dt = LINQToDataTable(listAchiement);//将listResult转化为DataTable类型数据
PrintReport.ReportDB myDB = new PrintReport.ReportDB();
myDB.Tables[“tbAchievement”].Merge(dt); //将dt的数据放入数据集的数据表中
AchievementReport rp = new AchievementReport();//实例化报表模板
string strRptPath = System.Web.HttpContext.Current.Server.MapPath("~/")
+ “Areas\ExaminationManagement\PrintReport\AchievementReport.rpt”; //获取报表物理文件地址
rp.Load(strRptPath); //把报表文件加载到ReportDocument
rp.SetDataSource(myDB); //设置报表数据源
//
Stream stream = rp.ExportToStream(CrystalDecisions.Shared.ExportFormatType.PortableDocFormat);
//把ReportDocument转化为文件流
return File(stream, “application/pdf”);
然后我们来到视图获取点击打印的按钮id,给它一个方法。
在这里插入图片描述
我们控制器和和视图的的打印数据的相关代码都写完了,是不是就可以了呢?其实不然。为了更实用,我们有必要加上这样一个判断步骤。
//将IEnumerable类型的集合 转换为DataTable类型
public DataTable LINQToDataTable(IEnumerable varlist)
{ //定义要返回的DataTable对象
DataTable dtReturn = new DataTable();
// 保存列集合的属性信息数组
PropertyInfo[] oProps = null;
if (varlist == null) return dtReturn;//安全性检查
//循环遍历集合,使用反射获取类型的属性信息
foreach (T rec in varlist)
{
//使用反射获取T类型的属性信息,返回一个PropertyInfo类型的集合
if (oProps == null)
{
oProps = ((Type)rec.GetType()).GetProperties();
//循环PropertyInfo数组
foreach (PropertyInfo pi in oProps)
{
Type colType = pi.PropertyType;//得到属性的类型
//如果属性为泛型类型
if ((colType.IsGenericType) && (colType.GetGenericTy· eDefinition()
== typeof(Nullable<>)))
{ //获取泛型类型的参数
colType = colType.GetGenericArguments()[0];
}
//将类型的属性名称与属性类型作为DataTable的列数据
dtReturn.Columns.Add(new DataColumn(pi.Name, colType));
}
}
//新建一个用于添加到DataTable中的DataRow对象
DataRow dr = dtReturn.NewRow();
//循环遍历属性集合
foreach (PropertyInfo pi in oProps)
{ //为DataRow中的指定列赋值
dr[pi.Name] = pi.GetValue(rec, null) == null ?
DBNull.Value : pi.GetValue(rec, null);
}
//将具有结果值的DataRow添加到DataTable集合中
dtReturn.Rows.Add(dr);
}
return dtReturn;//返回DataTable对象
}
这样才能保障我们获取到了数据才打印,不然就会出现问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值