用反射简化 asp.net 报表的一点总结
有幾個報表, 查詢條件都一樣,僅僅里面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的程序數量, 方便了以后系統的維護.
?
轉載于:https://www.cnblogs.com/liuzhendong/archive/2011/10/13/2210570.html
總結
以上是生活随笔為你收集整理的用反射简化 asp.net 报表的一点总结的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: POJ 2976 Dropping Te
- 下一篇: Adobe CTO:Android将超预