核心代码,报表类:
using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using DevExpress.XtraReports.UI;
using System.Data;
using System.Collections.Generic;
namespace CommonLib.Report
{
public partial class UserXtraReportBase : DevExpress.XtraReports.UI.XtraReport
{
public UserXtraReportBase()
{
InitializeComponent();
}
/// <summary>
/// 绑定数据
/// </summary>
/// <param name="ds"></param>
public void BindData(List<DataSet> dsList)
{
#region 报表本身的数据源绑定
if (!string.IsNullOrEmpty(Tag.ToString()))
{
string _groupIndex = Tag.ToString().Split(',')[0];
string _dtIndex = Tag.ToString().Split(',')[1];
string _relationName = Tag.ToString().Split(',')[2];
string _filedName = Tag.ToString().Split(',')[3];
if (_dtIndex == "")
{
DataSource = dsList[int.Parse(_groupIndex)];
DataMember = _relationName;
}
else
{
DataSource = dsList[int.Parse(_groupIndex)].Tables[int.Parse(_dtIndex)];
DataMember = dsList[int.Parse(_groupIndex)].Tables[int.Parse(_dtIndex)].TableName;
}
}
#endregion
#region 带区的数据源绑定
var _detailReportList = AllControls<DetailReportBand>();
foreach (DetailReportBand _c in _detailReportList)
{
if (_c.GetType().ToString() != typeof(DetailReportBand).ToString()) continue;
if (string.IsNullOrEmpty(_c.Tag.ToString()))
continue;
string _groupIndex = _c.Tag.ToString().Split(',')[0];
string _dtIndex = _c.Tag.ToString().Split(',')[1];
string _relationName = _c.Tag.ToString().Split(',')[2];
string _filedName = _c.Tag.ToString().Split(',')[3];
#region 如果被绑定的表无数据,则隐藏该DetailReport带区
if (dsList[int.Parse(_groupIndex)].Tables[int.Parse(_dtIndex)].Rows.Count == 0)
_c.Visible = false;
#endregion
_c.DataSource = dsList[int.Parse(_groupIndex)];
if (_relationName != "")
{
_c.DataMember = _relationName;
}
else if (_dtIndex != "")
{
_c.DataMember = dsList[int.Parse(_groupIndex)].Tables[int.Parse(_dtIndex)].TableName;
}
else
_c.DataMember = "";
}
#endregion
#region 在这里开发各种报表控件的数据绑定
#region 标签
var _xrLabelList = AllControls<XRLabel>();
foreach (XRLabel _c in _xrLabelList)
{
if (_c.GetType().ToString() != typeof(XRLabel).ToString()) continue;
BindXRControl("Text", dsList, _c);
}
#endregion
#region 选框
var _xrCheckBoxList = AllControls<XRCheckBox>();
foreach (XRCheckBox _c in _xrCheckBoxList)
{
if (_c.GetType().ToString() != typeof(XRCheckBox).ToString()) continue;
BindXRControl("Checked", dsList, _c);
}
#endregion
#region 富文本
var _xrRickTextList = AllControls<XRRichText>();
foreach (XRRichText _c in _xrRickTextList)
{
if (_c.GetType().ToString() != typeof(XRRichText).ToString()) continue;
BindXRControl("Text", dsList, _c);
}
#endregion
#region 图片
var _xrPictureBoxList = AllControls<XRPictureBox>();
foreach (XRPictureBox _c in _xrPictureBoxList)
{
if (_c.GetType().ToString() != typeof(XRPictureBox).ToString()) continue;
BindXRControl("Image", dsList, _c);
}
#endregion
#region 单元格
var _xrTableCellList = AllControls<XRTableCell>();
foreach (XRTableCell _c in _xrTableCellList)
{
if (_c.GetType().ToString() != typeof(XRTableCell).ToString()) continue;
BindXRControl("Text", dsList, _c);
}
#endregion
#region 条形码
var _xrBarCodeList = AllControls<XRBarCode>();
foreach (XRBarCode _c in _xrBarCodeList)
{
if (_c.GetType().ToString() != typeof(XRBarCode).ToString()) continue;
BindXRControl("Text", dsList, _c);
}
#endregion
#endregion
}
public static void BindXRControl(string propertyName, List<DataSet> dsList, XRControl c)
{
if (string.IsNullOrEmpty(c.Tag.ToString()))
return;
string _groupIndex = c.Tag.ToString().Split(',')[0];
string _dtIndex = c.Tag.ToString().Split(',')[1];
string _relationName = c.Tag.ToString().Split(',')[2];
string _filedName = c.Tag.ToString().Split(',')[3];
if (_relationName != "")
{
string _columnName = string.Format("{0}.{1}", _relationName, _filedName);
c.DataBindings.Add(propertyName, dsList[int.Parse(_groupIndex)], _columnName);
}
else if (_dtIndex != "")
{
c.DataBindings.Add(propertyName, dsList[int.Parse(_groupIndex)].Tables[int.Parse(_dtIndex)], _filedName);
}
else
c.DataBindings.Add(propertyName, dsList[int.Parse(_groupIndex)], _filedName);
}
/// <summary>
/// 判断控件Tag中是否定义了绑定数据的参数
/// </summary>
/// <param name="tag"></param>
/// <returns></returns>
public static bool HasTag(object tag)
{
if (tag == null || tag.ToString() == "" || !tag.ToString().Contains(","))
return false;
return true;
}
/// <summary>
/// 获取控件Tag参数之中包含的表索引
/// </summary>
/// <param name="tag"></param>
/// <returns></returns>
public static int GetTableIndex(object tag)
{
return int.Parse(tag.ToString().Split(',')[0]);
}
/// <summary>
/// 获取控件Tag参数之中包含的字段名称
/// </summary>
/// <param name="tag"></param>
/// <returns></returns>
public static string GetColumnName(object tag)
{
return tag.ToString().Split(',')[1];
}
}
}
报表控件在Preview时触发事件来更改指定控件值:
private void simpleButton4_Click(object sender, EventArgs e)
{
report.FindControl("xrLabel1", false).PreviewClick += Form1_PreviewClick;
}
void Form1_PreviewClick(object sender, PreviewMouseEventArgs e)
{
e.Brick.Text = DateTime.Now.ToString();
e.PreviewControl.Refresh();
}
将报表显示到DocumentViewer控件之上的关键代码
XtraReport1 report;
DocumentViewer _doc = new DocumentViewer();
private void simpleButton1_Click(object sender, EventArgs e)
{
report = new XtraReport1();
report.BindData();
report.CreateDocument();
_doc.DocumentSource = report;
}
报表保存和加载文档文件的代码
report.PrintingSystem.SaveDocument();
report.PrintingSystem.LoadDocument();