水晶报表是没有什么属性可以直接对其背景图片进行设置的,更别说对其动态改变了,下午受一同事启发,我们可以通过更新数据源的方式来间接的对水晶报表背景图片进行动态设置。
还是采用PUSH模式(这种情况估计也只能采用该模式),我们在数据集DataSet1里特别加了一个BackImgTable,里面只放一个字段img(byte[]类型),如图示:
BackImgTable仅仅用于存放报表的背景图片信息。
接下来我们在设计模板里新加一个页眉节,在页眉a节只放置img字段,既然是作为报表的背景图片,所以尽量把该img字段的宽高拉得和纸张一样大(我这边仅仅只是一个样例,故img字段没有拉得如此大),进入节专家设置如下:
最后我们进入关键的代码部分:
- // 我这里设置成全局变量
- DataSet1 ds = new DataSet1();
- private void btnReport_Click(object sender, EventArgs e)
- {
- CrystalReport1 myReport = new CrystalReport1();
- myReport.SetDataSource(ds); //为报表设置数据源
- crystalReportViewer1.ReportSource = myReport;
- }
- //页面加载时给“空壳”数据集DataSet1 填充数据,此时的“骨架”就不再是一个空匣子了~
- private void Form1_Load(object sender, EventArgs e)
- {
- AddBackgroundImageButton();
- FileStream fs = new FileStream(@"G:/资料包/相册/me/图片 002.jpg", FileMode.Open, FileAccess.Read); //报表默认背景图片
- BinaryReader br = new BinaryReader(fs);
- byte[] picBuffer = br.ReadBytes((int)fs.Length);
- br.Close();
- fs.Close();
- ds.BackImgTable.AddBackImgTableRow(picBuffer);
- ds.myDataTable.AddmyDataTableRow("丁一", 102);
- ds.myDataTable.AddmyDataTableRow("王二", 100);
- }
- /// <summary>
- /// 为水晶报表自带工具栏添加“更改背景图片”按钮
- /// </summary>
- private void AddBackgroundImageButton()
- {
- foreach (Control c in crystalReportViewer1.Controls)
- {
- if (c is ToolStrip)
- {
- // 新建一个工具栏按钮
- ToolStripButton myBackgroundImageButton = new ToolStripButton();
- // 设置工具栏按钮的提示文本
- myBackgroundImageButton.ToolTipText = "更改背景图片";
- // 先借用下第一个导出按钮的图标
- myBackgroundImageButton.Image = ((ToolStripButton)(((ToolStrip)c).Items[0])).Image;
- // 给新建的工具栏按钮添加事件
- myBackgroundImageButton.Click += new EventHandler(myBackgroundImageButton_Click);
- // 把新建的工具栏按钮插入到报表自带工具栏的末尾
- ((ToolStrip)c).Items.Add(myBackgroundImageButton);
- }
- }
- }
- /// <summary>
- /// 更改背景图片按钮事件
- /// </summary>
- private void myBackgroundImageButton_Click(object sender, EventArgs e)
- {
- OpenFileDialog ofd = new OpenFileDialog();
- ofd.Filter = "jpg图像|*.jpg|png图像|*.png";
- string strPicPath = string.Empty;
- if (ofd.ShowDialog() == DialogResult.OK)
- {
- strPicPath = ofd.FileName;
- }
- if (string.IsNullOrEmpty(strPicPath))
- {
- return;
- }
- FileStream fs = new FileStream(strPicPath, FileMode.Open, FileAccess.Read);
- BinaryReader br = new BinaryReader(fs);
- byte[] picBuffer = br.ReadBytes((int)fs.Length);
- br.Close();
- fs.Close();
- ds.BackImgTable.Clear(); //要先清除原来的背景图片
- ds.BackImgTable.AddBackImgTableRow(picBuffer);
- CrystalReport1 myReport = new CrystalReport1();
- myReport.SetDataSource(ds); //为报表设置数据源
- crystalReportViewer1.ReportSource = myReport;
- }
最终运行效果如下:
ADD @2010-12-2
可在工具栏再新增一按钮,该按钮可控制报表背景图片的显示或隐藏,参考:
- /// <summary>
- /// 显示/隐藏水晶报表背景图片
- /// </summary>
- private void ShowOrHideBackImg_Click(object sender, EventArgs e)
- {
- reportDoc.SetParameterValue("showBackImg", !IsShowReportBackImg);
- XmlReportConfig.SetCRIsShowBackImg(!IsShowReportBackImg);
- IsShowReportBackImg = !IsShowReportBackImg;
- foreach (Control c in crystalReportViewer1.Controls)
- {
- if (c is ToolStrip)
- {
- int toolStripButtonNum = ((ToolStrip)c).Items.Count;
- if (IsShowReportBackImg)
- {
- ((ToolStrip)c).Items[toolStripButtonNum - 1].ToolTipText = "隐藏背景图片";
- ((ToolStrip)c).Items[toolStripButtonNum - 1].Image = LanguageSetDLL.GetImage("hideBackImg");
- ((ToolStrip)c).Items[toolStripButtonNum - 2].Enabled = true;
- }
- else
- {
- ((ToolStrip)c).Items[toolStripButtonNum - 1].ToolTipText = "显示背景图片";
- ((ToolStrip)c).Items[toolStripButtonNum - 1].Image = LanguageSetDLL.GetImage("showBackImg");
- ((ToolStrip)c).Items[toolStripButtonNum - 2].Enabled = false;
- }
- break;
- }
- }
- crystalReportViewer1.ReportSource = reportDoc;
- }
其中布尔型参数showBackImg是用来控制背景图片所在节(我这里是 页眉a节)的显示与否,而IsShowReportBackImg则是全局布尔型变量,用来指示当前报表是否显示背景图片(默认是true---显示背景图片)
评论回复