用反射简化 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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/464529.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

超轻型的数据库sqlite

很多次看到别人提到这个东西&#xff0c;最近因项目需要看了看&#xff0c;确实好用。总共就两个文件&#xff0c;我想不能再简单了。还是开源的。开发rails也可以用&#xff0c;不错&#xff01;转载于:https://www.cnblogs.com/chenge/archive/2005/06/29/183508.html

有些事不用听别人的

今天在群里跟几个朋友聊天&#xff0c;然后说了自己的想法&#xff0c;最近很多人在说公众号不会有好的发展&#xff0c;写文章也是没有出路的。不过这个是事实。短视频才是可能是出路&#xff0c;短视频是个很大的蛋糕&#xff0c;从表达方式上来说&#xff0c;视频的表达方式…

php读取三维数组,php 读取多维数组方法_PHP教程

php 读取多维数组方法for($i0;$i{for($j0;$j{echo $array[$j][userid];}}因为它是个多维数组,一般用foreach ($arr as $key > $value) {echo "Key: $key; Value: $value\n";}Array ( [0] > Array ( [userid] > 1 [username] > 刘振鹏 [status] > 0 [u…

互斥锁mutex的使用方法

在线程实际运行过程中&#xff0c;我们经常需要多个线程保持同步。这时可以用互斥锁来完成任务&#xff1b;互斥锁的使用过程中&#xff0c;主要有pthread_mutex_init&#xff0c;pthread_mutex_destory&#xff0c;pthread_mutex_lock&#xff0c;pthread_mutex_unlock这几个函…

1000瓶药水,1瓶有毒药,几只小白鼠能够找出毒药

1000瓶药水&#xff0c;1瓶有毒药&#xff0c;服用后一小时毒发&#xff0c;毒药可以无限稀释&#xff0c;那么一小时内用几只小白鼠能够找出毒药&#xff1f; 假如是8瓶药水&#xff0c;3只小白鼠。 0000  0011  0102  0113  1004  1015  1106  1117 每位数表示…

25个优秀的设计机构网站设计案例

今天&#xff0c;我们一起来欣赏网站设计工作室自己的网站。设计公司的网站除了要能够吸引客户以外&#xff0c;还要通过他们自己的网站向客户展示他们的设计理念和风格。这里收集的25个优秀的设计机构网站既有清爽简洁风格的&#xff0c;也有色彩丰富&#xff0c;图文并茂的&a…

windows server 2003 出错提示请求的资源在使用中解决方案

1.杀毒软件造成IIS站点‘请求的资源在使用中’”的消息&#xff0c;如瑞星2005&#xff0c;服务器上使用单机版杀毒一般都不会稳定的。马上把瑞星卸载了&#xff0c;重启机器&#xff0c;一切正常。 2.IUSR_机器名和IWAM_机器名的账号不同步,这个在网上已经有解决方案了只要打开…

一个适用各类场合的Makefile模板

1.写在前面对于Windows下开发&#xff0c;很多IDE都集成了编译器&#xff0c;如Visual Studio&#xff0c;提供了“一键编译”&#xff0c;编码完成后只需一个操作即可完成编译、链接、生成目标文件。Linux开发与Windows不同&#xff0c;Linux下一般用的的gcc/g编译器&#xff…

matlab r2014a错误,MATLAB中的潜在错误使R2014a回归

MATLAB R2014a过去工作得很好w回归但是现在当变量很好并且排名满意时我得到一个错误。X rand([10 3])X 0.8407 0.3517 0.07590.2543 0.8308 0.05400.8143 0.5853 0.53080.2435 0.5497 0.77920.9293 0.9172 0.93400.3500 0.2858 0.12990.1966 0.7572 0.56880.2511 0.7537 0.469…

Android 如何退出整个应用程序?

转载文章&#xff1a;http://blog.csdn.net/sunnyfans/article/details/7688092 Android 怎么退出整个应用程序&#xff1f; 我们在写android应用程序时&#xff0c;经常会遇到想退出当前Acitivity&#xff0c;或者直接退出应用程序.我之前的一般操作是按返回键&#xff0c;或者…

excel拼接数据宏

将sheet2的A2 和 G2 加上 sheet5的A2和B2合一起生成新的sheet--就是将两个sheet的指定列前后拼接一起作为一个新的sheet Sub addwork() Sheets.Add after:Sheets(Sheets.Count) ActiveSheet.Name "临时合并数据" Dim s, sht, shts Dim arr, brr1, br…

关于我曾经做过的一个商业社区的ui框架

1.主页面default2.容器,中间页面process载入模板3.模板:BasePage4,BasePageprotected override void Render(System.Web.UI.HtmlTextWriter writer) {writer.WriteLine("Header");base.Render(writer);writer.WriteLine("Header");}转载于:https://www.cnb…

毕业十年|我的嵌入式AI学习路线(笔记、代码)

嵌入式从业者接下来会有怎样的黄金十年&#xff1f;在物联网和人工智能的促进下&#xff0c;嵌入式在未来的5-10年内会迎来更多的发展机会&#xff0c;一方面嵌入式开发会迎来更多的应用场景&#xff0c;另一方面嵌入式开发的技术体系也会逐渐丰富&#xff0c;从而拓展物联网开…

DAL调用SP时出现的异常处理

三种情形&#xff1a; 1.执行SP时出错&#xff0c;如连接异常&#xff0c;数据库权限异常 2.SP代码中抛出异常 3.返回值/输出参数的值不符合约定 后两种情形需要在异常发生时记录传入SP的参数值&#xff1b;业务逻辑层需要捕获并重抛&#xff0c;以保证UI层提供给用户友好的错误…

在艰苦年代,买不起万用表,怎么测量电路电压?

如何测量电压&#xff1f;有这样一张图片&#xff1a;用舌头来测量&#xff1f;开玩笑的吧&#xff01;不过这张照片勾起了我的回忆&#xff1a;有一位玩电子的老前辈&#xff0c;现在已经70多岁了。和他聊天&#xff0c;他说&#xff0c;当年他们玩电子&#xff0c;条件非常艰…

71道经典Android面试题,涵盖了所有android知识点,值得学习和思考

1. 下列哪些语句关于内存回收的说明是正确的? (b ) A、 程序员必须创建一个线程来释放内存 B、内存回收程序负责释放无用内存 C、内存回收程序允许程序员直接释放内存 D、内存回收程序可以在指定的时间释放内存对象 2. 下面异常是属于Runtime Excepti…

VBA学习_5:流程控制

1、If If Range("B2").Value >60 Then Range("C2").Value "及格" Else Range("C2").Value"不及格"如果。。。那么。。。。否则。。。。 If Range("B2").Value > 60 ThenRange("C2").Value "…

gis python 桌面,arc-utils-用于Esri ArcGIS桌面软件的Python实用程序-Grant Herbert

作者:Grant Herbert### 作者邮箱:gdherbertgmail.com### 首页:https://github.com/gdherbert/arc_utils### 文档:None### 下载链接 https://github.com/gdherbert/arc_utils/tree/0.6.8# README #What is this repository for?A collection of (mostly) arcpy related utiliti…

SQL SERVER7应用

交互式SQL&#xff08;Transact SQL&#xff0c;TSQL&#xff09;它是SQL Server的查询语言。提供以下命令&#xff1a; 创建和数据库对象。 访问和修改数据。 数据聚合&#xff08;aggregation&#xff0c;又称聚集&#xff09;。 实施安全措施。数据库对象 数据库对象是…

嵌入式的薪资还是挺低的

我最近和一个比较好的朋友聊天&#xff0c;我这个朋友在一家比较传统的公司&#xff0c;在这个公司做嵌入式软件开发&#xff0c;偏系统方向的。然后最近拿到了几个不错的offer&#xff0c;让我帮忙看看。这几个offer我就不发出来给大家看了。可以肯定的是&#xff0c;这几个of…