博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
用反射简化 asp.net 报表的一点总结
阅读量:6720 次
发布时间:2019-06-25

本文共 5236 字,大约阅读时间需要 17 分钟。

有几个报表, 查询条件都一样,仅仅里面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

你可能感兴趣的文章
Android、iOS和Windows Phone中的推送技术
查看>>
活动目录管理工具---使用保存的查询
查看>>
MFC读写文件
查看>>
Ansible8:Playbook循环
查看>>
海淘也疯狂 跨境电商网站8月监测报告
查看>>
【51CTO学院三周年】我的在51CTO学院学习的感想
查看>>
redis+session的共享
查看>>
ls按时间排序输出文件列表
查看>>
03 bash特性
查看>>
Line in和Mic in的区别及使用
查看>>
Linux压缩和解压缩命令
查看>>
Permutations
查看>>
2.9-php使用Redis存储
查看>>
constraint
查看>>
Linux磁盘管理 3月23日课程笔记
查看>>
CentOS 挂载fat32 中文乱码
查看>>
一个好的icon下载网站
查看>>
C++中的substr()
查看>>
【C语言】球体从100米下落问题
查看>>
(问题解决篇)ubuntu更新时,出现错误E: Some index files failed to download。。。
查看>>