7月13日RDLC报表,ReportViewer使用详解
RDLC报表,ReportViewer
1、简单易用的控件,特别是Table控件,非常方便字段在报表上的排列;
2、灵活的可定制性,用XML来描述一个报表相关的一切,不用说了吧?
3、高度可编程性,在你的项目中,甚至不需要有一个报表文件,通过代码就可以实现报表生成、预览和打印等一系列操作;
4、支持DrillThrough数据钻取功能;
5、导出的Excel文件格式非常完美,任何其它报表在这方面都不能与之比拟,而且并不需要安装Excel;
……[偷偷懒,其实我并不擅长总结某某的特点,我只能从实际经验中得到一点点结论,而且我也不原意去抄袭帮助中的New Features,呵呵……]
相关的资源:
GotReportViewer http://www.gotreportviewer.com/ (有几个非常经典的例子,不知为什么最近我无法上这个网站了,呵呵,谁知道请告诉我原因,谢谢!)
1、Web Log Analyzer
这是一个比较典型的OLAP应用,我们可以看到RDLC报表强大的Chart和Navigation功能。当然了,例子中解析W3C标准日志文件的代码也非常有借鉴意义。这个Starter Kit在我的随笔 http://waxdoll.cnblogs.com/archive/2006/01/19/320280.html中曾经提到过,不再详述。
2、子报表
展示如何使用子报表显示主记录的详细信息,这种应用很像Access中的子报表功能。主要使用SubreportProcessing事件为子报表提供数据。
3、钻取报表
钻取报表是通过设置Navigation(HyperLink)和Parameters来实现的,通常在OLAP应用程序中很有用。
4、具有子报表的钻取报表
这个例子实现的功能类似Excel中数据透视表(Pivot Table)的功能,在一个复杂的交叉表中可以进行时间和商品两个维度的向下钻取。这在别的报表中恐怕是很难实现的。如图所示,
另外一个相关的示例基本上与此相同,只不过在Util类中访问一个文本文件并将该文本文件中的字符显示在报表中
可以直接使用Report Viewer控件自带的按钮生成Excel文件,也可以使用如下代码来完成操作:
string[] strStreamIds;
string strMimeType;
string strEncoding;
string strFileNameExtension;
{
fs.Write(bytes, 0, bytes.Length);
}
对于LocalReport的Render方法,以后的随笔中将进行详细阐述。
7、交互排序
当然这个sample是为了展示对Object类型数据源的支持,报表参数ReportParameter的使用也在其中得到体现。
10、从命令行中打印报表
12、动态生成一个RDLC文件
另外,我手头有一份RDL规范(Report Definition Language Specification),非常值得阅读,推荐给大家 http://files.cnblogs.com/waxdoll/RDLCS.rar。两幅截图:
Matrix
Table
List控件的用处在于这是一个在其中可以自由安排像TextBox、Image等控件;Chart控件用于显示图表,和Excel中的图表比较相似。这篇随笔不会涉及到这两个控件,主要讲一下Table和Matrix两个控件。
之所以设计这样一个控件,我想Microsoft一定是在简化报表的设计:
随着Visual Studio 2005中文版的推出,Microsoft汉化了MSDN的大部分内容,开发者再也不用啃英文了,本来想介绍一下LocalReport的Render方法,现在您可以到 http://msdn2.microsoft.com/zh-cn/library/ms252207(VS.80).aspx获得关于这部分的详细信息。之所以以前想介绍这个方法,是因为我将想大家介绍一种在Crystal Report中无法实现的自定义票据打印纸张的方法。Anyway,现在我直接向大家介绍这种方法,可能这种方法并不是很好的,但是确实是我经过一段时间的摸索总结出来的。萝卜( http://luobos.cnblogs.com)曾经提到过的变通的方法不知道是不是我要介绍的这一种,欢迎和我进行交流!
private IList<Stream> m_streams;
{
Stream stream = new FileStream(name + "." + fileNameExtension, FileMode.Create);
m_streams.Add(stream);
return stream;
}
{
string deviceInfo =
"<DeviceInfo>" +
" <OutputFormat>EMF</OutputFormat>" +
" <PageWidth>8.5in</PageWidth>" +
" <PageHeight>11in</PageHeight>" +
" <MarginTop>0.25in</MarginTop>" +
" <MarginLeft>0.25in</MarginLeft>" +
" <MarginRight>0.25in</MarginRight>" +
" <MarginBottom>0.25in</MarginBottom>" +
"</DeviceInfo>";
Warning[] warnings;
m_streams = new List<Stream>();
report.Render("Image", deviceInfo, CreateStream, out warnings);
stream.Position = 0;
}
{
Metafile pageImage = new Metafile(m_streams[m_currentPageIndex]);
ev.Graphics.DrawImage(pageImage, ev.PageBounds);
ev.HasMorePages = (m_currentPageIndex < m_streams.Count);
}
{
const string printerName = "Microsoft Office Document Image Writer";
return;
printDoc.PrinterSettings.PrinterName = printerName;
if (!printDoc.PrinterSettings.IsValid)
{
string msg = String.Format("Can't find printer \" {0}\".", printerName);
Console.WriteLine(msg);
return;
}
printDoc.PrintPage += new PrintPageEventHandler(PrintPage);
printDoc.Print();
}
{
LocalReport report = new LocalReport();
report.ReportPath = "Report.rdlc";
report.DataSources.Add(new ReportDataSource("Sales", LoadSalesData()));
Print();
}
/// 获取当前时间组成的字符串,用作生成不会重复的文件名
/// </summary>
/// <returns></returns>
private string GetTimeStamp()
{
string strRet = string.Empty;
System.DateTime dtNow = Pub.DateTimeEx.ServerTime;
strRet += dtNow.Year.ToString() +
dtNow.Month.ToString("00") +
dtNow.Day.ToString("00") +
dtNow.Hour.ToString("00") +
dtNow.Minute.ToString("00") +
dtNow.Second.ToString("00") +
System.DateTime.Now.Millisecond.ToString("000");
return strRet;
/// 导出到Excel
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void toolExcel_Click(object sender, EventArgs e)
{
string[] strStreamIds;
string strMimeType;
string strEncoding;
string strFileNameExtension;
{
fs.Write(bytes, 0, bytes.Length);
}
{
System.Diagnostics.Process.Start(strFilePath);
}
/// 刷新报表数据
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void tool刷新_Click(object sender, EventArgs e)
{
this.rptViewer.RefreshReport();
}
/// 在加载报表数据时终止报表数据的加载
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void tool终止_Click(object sender, EventArgs e)
{
this.rptViewer.CancelRendering(0);
}
/// 从DrillThrough报表返回到导航页面
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void tool返回_Click(object sender, EventArgs e)
{
if (this.rptViewer.LocalReport.IsDrillthroughReport)
this.rptViewer.PerformBack();
}
/// 回到报表的第一页
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void tool第一页_Click(object sender, EventArgs e)
{
this.rptViewer.CurrentPage = 1;
}
/// 跳转到报表的最后一页
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void tool最后一页_Click(object sender, EventArgs e)
{
this.rptViewer.CurrentPage = this.rptViewer.LocalReport.GetTotalPages();
}
/// 以25%的比例显示报表
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void tool25_Click(object sender, EventArgs e)
{
this.rptViewer.ZoomMode = ZoomMode.Percent;
this.rptViewer.ZoomPercent = 25;
}
/// 以50%的比例显示报表
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void tool50_Click(object sender, EventArgs e)
{
this.rptViewer.ZoomMode = ZoomMode.Percent;
this.rptViewer.ZoomPercent = 50;
}
/// 以100%的比例显示报表
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void tool100_Click(object sender, EventArgs e)
{
this.rptViewer.ZoomMode = ZoomMode.Percent;
this.rptViewer.ZoomPercent = 100;
}
/// 以200%的比例显示报表
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void tool200_Click(object sender, EventArgs e)
{
this.rptViewer.ZoomMode = ZoomMode.Percent;
this.rptViewer.ZoomPercent = 200;
}
/// 以400%的比例显示报表
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void tool400_Click(object sender, EventArgs e)
{
this.rptViewer.ZoomMode = ZoomMode.Percent;
this.rptViewer.ZoomPercent = 400;
}
/// 将缩放模式设置为整页
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void tool整页_Click(object sender, EventArgs e)
{
this.rptViewer.ZoomMode = ZoomMode.FullPage;
}
/// 将缩放模式设置为页宽
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void tool页宽_Click(object sender, EventArgs e)
{
this.rptViewer.ZoomMode = ZoomMode.PageWidth;
}
/// 在报表中搜索txtSearch中的字符
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void tool搜索_Click(object sender, EventArgs e)
{
if (this.txtSearch.Text.Trim() == string.Empty)
return;
}
/// 搜索报表中下一处txtSearch中的字符
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void tool搜索下一个_Click(object sender, EventArgs e)
{
if (this.txtSearch.Text.Trim() == string.Empty)
return;
}
/// 跳转到上一页
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void tool上一页_Click(object sender, EventArgs e)
{
if (this.rptViewer.CurrentPage != 1)
this.rptViewer.CurrentPage--;
}
/// 跳转到下一页
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void tool下一页_Click(object sender, EventArgs e)
{
if (this.rptViewer.CurrentPage != this.rptViewer.LocalReport.GetTotalPages())
this.rptViewer.CurrentPage++;
}
/// 跳转到由txt跳转中指定的页数
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void tool跳转_Click(object sender, EventArgs e)
{
if (this.txt跳转.Text.Trim() == string.Empty)
return;
if (intJump <= this.rptViewer.LocalReport.GetTotalPages())
this.rptViewer.CurrentPage = intJump;
转载于:https://www.cnblogs.com/Alum/archive/2010/04/20/3587985.html
7月13日RDLC报表,ReportViewer使用详解相关推荐
- 绝地求生服务器维护啥意思,2019绝地求生7月10日正式服维护内容详解介绍
2019绝地求生7月10日正式服维护内容详解介绍 2019-07-10 09:13:52来源:pubg官方微博编辑:君辞-v-评论(0) 2019绝地求生7月10日正式服维护更新了什么内容?游戏在今天 ...
- 与 Scott Guthrie 一道感受技术激情 1月13日于北京
可能很多朋友已经知道了这个消息,我觉得还是写一下,别让这个机会白白溜走.Scott Guthrie是谁,我就不介绍了,简单说:ASP.NET之父,Silverlight 的主要创始人,还管着太多微软的 ...
- 参与2011年7月13日举行的Azure国际猜拳锦标赛,赢取5,000美元大奖
你想要编写自己的"bot"角色并测试你的技能,在线同来自美国,加拿大,中国,德国,新西兰,瑞典和英国的Windows Azure开发者一教高下,并赢取5,000美元大奖吗?请先注册 ...
- 2008年12月13日上海USB驱动开发深度解析讲座PPT
讲座PPT:宋宝华2008年12月13日上海USB驱动开发深度解析讲座PPT [url]http://www.linuxdriver.cn/200812/20081213172619_836.rar[ ...
- PANDAS 数据合并与重塑(concat篇) 原创 2016年09月13日 19:26:30 47784 pandas作者Wes McKinney 在【PYTHON FOR DATA ANALYS
PANDAS 数据合并与重塑(concat篇) 原创 2016年09月13日 19:26:30 标签: 47784 编辑 删除 pandas作者Wes McKinney 在[PYTHON FOR DA ...
- 中科院计算所开源Easy Machine Learning:让机器学习应用开发简单快捷 By 机器之心2017年6月13日 13:05 今日,中科院计算所研究员徐君在微博上宣布「中科院计算所开源了
中科院计算所开源Easy Machine Learning:让机器学习应用开发简单快捷 By 机器之心2017年6月13日 13:05 今日,中科院计算所研究员徐君在微博上宣布「中科院计算所开源了 E ...
- 开博首发2017年1月13日开博大吉
开博首发2017年1月13日开博大吉 转载于:https://blog.51cto.com/wangheyu1/1891673
- 龙剑服务器为什么总是维修,《龙剑》2014年3月13日更新维护公告
亲爱的<龙剑>技术测试玩家: 为了保证服务器的稳定和服务质量,本周例行维护将于2014年3月13日上午8:00停机,维护时间为上午8点至11点左右.如果在维护期间无法完成维护内容,开机时间 ...
- 【参会指南】神策 2020 数据驱动用户大会,10 月 13 日将重磅开幕!
10 月 13-14 日,主题为「数字化·正当潮」的 2020 数据驱动用户大会,将在北京香格里拉如约举行. 「数据驱动用户大会」是由神策数据创办的年度盛会,已连续举办五年,致力于为数据爱好者打造一个 ...
最新文章
- IT规划宜分步走 忌盲目好大喜功(载)
- API 分页探讨:offset 来分页真的有效率吗?
- 数据结构读书笔记(三)(C语言)
- 扫描路径_SolidWorks沿路径扭转扫描的线缆实例
- 人工神经网络——笔记摘抄1
- 为Kindeditor控件添加图片自动上传功能
- easy ui dialog 关闭之后的怪异问题
- Windows Phone 7 自适应键盘输入
- ajax 连接java,如何使用Ajax连接到Java servlets?
- 要么出色,要么出局!威马公布三大核心技术矩阵背后的大野心
- sga_target大于sga_max_size数据库无法启动
- redis与mysql性能对比、redis缓存穿透、缓存雪崩
- win8下IE10停止工作解决办法
- php输出一个直角三角形,php hypot()直角三角形斜边长度 is_infinite()是否为无限值...
- Vue + MathLive 实现数学公式可编辑
- c语言调用calculate函数,关于c语言中int calculate函数求解。谢谢
- 网络层次模型及各层对应协议
- Zabbix的SNMPTrap监控配置
- FreeCAD-0.19源码编译教程
- linux 操作系统笔记基础命令