有几个报表, 查询条件都一样,仅仅里面GridView中有几个列区别,以前图快,就把原来Report.aspx文件拷贝一份,改名为Report1.aspx,然后,修改里面的column,然后再由后台库查出数据,填充到这个report中来。
今天终于不耐烦了,这个方法确实太笨了,改一改,方案如下:
1.创建一个IReport的接口,所有的report都实现这个接口。
public interface IReport
{ // 该report所有可用列集合(每一次查询不一定全部显示) Dictionary<string, string> DictColMapping { get; }
// (本次查询)该report显示的列KeyField和HeaderText集合
Dictionary<string, int> DictColIndexMapping { get; }
/// (本次查询)该report显示的列SortExpressField和所在位置Index集合List<ReportColumn> ReportColumnCollection { get; }
// 导出excel的文件名 string ToExcelName { get; }
// 该report的唯一编号,用于安全验证
string ReportResourceID { get; }
// 产生report,输入条件为一个参数数组
DataSet ProccessReport(params object[] ParamList); }
2.创建一个ReportColumn类。
public class ReportColumn
{ public string ColumnDataField { set; get; } public string ColumnHeaderText { set; get; } public string ColumnSortExpression { set; get; } public int ColumnIndex { set; get; }public ReportColumn(string _ColumnDataField, string _ColumnHeaderText, string _ColumnSortExpression, int _ColumnIndex)
{ this.ColumnDataField = _ColumnDataField; this.ColumnHeaderText = _ColumnHeaderText; this.ColumnSortExpression = _ColumnSortExpression; this.ColumnIndex = _ColumnIndex; } }
3.创建报表的抽象基类,里面放些处理类似报表的通用方法。
public abstract class clsReportBase
{} 4.创建实际的报表类public class clsReport_SalesOrder : clsReportBase, IReport
{ private List<ReportColumn> _ReportColumnCollection; //该report所有可用列集合(每一次查询不一定全部显示) private Dictionary<string, string> _DictColMapping; //(本次查询)该report显示的列KeyField和HeaderText集合 private Dictionary<string, int> _DictColIndexMapping; //(本次查询)该report显示的列SortExpressField和所在位置Index集合 public clsReport_SalesOrder() { _ReportColumnCollection = new List<ReportColumn>(); _DictColMapping = new Dictionary<string, string>(); _DictColIndexMapping = new Dictionary<string, int>(); FillReportColumnCollection(); }/// <summary>
/// 填充该report所有可用列集合 /// </summary> private void FillReportColumnCollection() { AddColumnToCollection(new ReportColumn("Province", "省", "省", 0)); AddColumnToCollection(new ReportColumn("Vertical", "行业", "行业", 1)); AddColumnToCollection(new ReportColumn("ProductLine", "产品", "产品", 2));AddColumnToCollection(new ReportColumn("Subtotal", "订单额($)", "订单额($)", 3));
}/// <summary>
/// 该report所有可用列集合(每一次查询不一定全部显示) /// </summary> public List<ReportColumn> ReportColumnCollection { get { return _ReportColumnCollection; } }/// <summary>
/// (本次查询)该report显示的列KeyField和HeaderText集合 /// </summary> public Dictionary<string, string> DictColMapping { get { return _DictColMapping; } }/// <summary>
/// (本次查询)该report显示的列SortExpressField和所在位置Index集合 /// </summary> public Dictionary<string, int> DictColIndexMapping { get { return _DictColIndexMapping; } }/// <summary>
/// (本次查询)该report需要格式化为货币的列集合 /// </summary> public List<string> MoneyFormatColumnCollection { get { return _MoneyFormatColumnCollection; } }/// <summary>
/// report名称 /// </summary> public string ToExcelName { get { return "订单统计.xls"; } }/// <summary>
/// report唯一编码 /// </summary> public string ReportResourceID { get { return "12345"; } }private void AddColumnToCollection(ReportColumn column)
{ _ReportColumnCollection.Add(column); _DictColMapping.Add(column.ColumnDataField, column.ColumnHeaderText); _DictColIndexMapping.Add(column.ColumnSortExpression, column.ColumnIndex); }/// <summary>
/// 产生report,输入条件为一个参数数组 /// </summary> /// <param name="ParamList"></param> /// <returns></returns> public DataSet ProccessReport(params object[] ParamList) {...从ParamList参数列表里解析出查询条件,然后从数据库取数据。
}}
5.前台aspx页面里的GridView
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="false" CellPadding="2" CssClass="autoTable" AllowSorting="false">
<Columns> </Columns></asp:GridView>
6.在前台aspx.cs页面里,通过url传来的报表类名,反射出报表的实例。
protected void Page_Load(object sender, EventArgs e)
{ _InitReport(this.Request.QueryString["Report"]);}
private void _InitReport(string QueryString)
{ string reportClassName = QueryString; string reportAssemblyName = "Test"; string reportFullClassName = reportAssemblyName + "." + reportClassName; report = (IReport)Assembly.Load(reportAssemblyName).CreateInstance(reportFullClassName);_DictColMapping = new Dictionary<string, string>();
_DictColMapping = report.DictColMapping;_DictColIndexMapping = new Dictionary<string, int>();
_DictColIndexMapping = report.DictColIndexMapping;GridView1.Columns.Clear();
foreach (ReportColumn column in report.ReportColumnCollection) { BoundField bf = new BoundField(); bf.DataField = column.ColumnDataField; bf.HeaderText = column.ColumnHeaderText; bf.SortExpression = column.ColumnSortExpression; bf.HeaderStyle.Wrap = false; bf.ItemStyle.Wrap = false; GridView1.Columns.Add(bf); } }
protected void btn_Search_Click(object sender, EventArgs e)
{ object[] arr = new object[] { UserObject, ConditionObject ... }; DataSet m_Data = report.ProccessReport(arr);HideSomeColumns(m_Data); //如果需要,可以在此屏蔽不显示的列,设置列visiable=false.
this.GridView_SalesOrderSummarization.DataSource = m_Data.Tables[0];
this.GridView_SalesOrderSummarization.DataBind(); }7.这样, 就只用一个aspx文件文成多个报表了, 只要把类型当作参数传过来即可.
Report.aspx?Report=clsReport_SalesOrder
Report.aspx?Report=clsReport_SalesOrder2
这样就精简了前台aspx的程序数量, 方便了以后系统的维护.