Saturday, January 9, 2010

Tips of FastReport for .Net

在用Delphi开发报表时代, FastReport是我不二的选择. 现在用C#, 一直没有找到合适的报表工具, 微软的RDLC, 我是怎么都不习惯.  最近我下载了FastReport For .Net, 又让我找回了开发报表的快感. 官网上下载的demo版本, 只有唯一的一个限制, 就是最终报表预览会有一个Demo Version的水印,  FR官方够慷慨啊.

一般设计时, 只需在Form上放两个FastReport的组件EnvironmentSettings, Report. 其中EnvironmentSettings可以用来设定FastReport的UI风格/Email设置/Preview设置等等, 我们可以在Report组件中设计报表, 在报表中, 可以添加DataSource和Parameter.  一般的中国式报表, 我们都需要加个Data Band在Page页面上. 需要为Data Band指定一个data Source, 这样Data Band上的TextBox才会在循环取出Data Source中每个记录, 否则DataBand只能显示DataSource的第一条记录.


下面的代码是, 怎样在Form中显示FastReport的预览界面.

        private void ShowRptWithFastReport()
        {
            int categoryID = ((FeeCategory)(comboBoxFeeCategory.SelectedItem)).CategoryID;

            //往report中传递两个参数值
            report1.SetParameterValue("ParamMagicNumber", m_MagicNumber);
            report1.SetParameterValue("ParaFeeCategory", categoryID);

            //动态设置Report中数据源(该数据源名为Connection)的ConnectionString
            var frConn = (MsSqlDataConnection)report1.FindObject("Connection");
            frConn.ConnectionString = Settings.Default.AccSetDbConnectionString;

            ////显示报表预览界面
            report1.Show(true);
        }



我们的软件有正式版和试用版之分, 对于试用版, 我们只允许用户打印前5页. 那么, 该如何控制呢? 用FastReport非常简单. 
步骤1: 设置Report的DoublePass属性为True,  这样FastReport引擎会对报表扫描2次, 第一次取数据, 第二次显示数据.
步骤2: 在Data1(它是个DataBand)上增加下面的事件.

    private void Data1_BeforePrint(object sender, EventArgs e)
    {
      if (Engine.FinalPass)
      {
        if (Engine.CurPage>=Convert.ToInt32(Report.GetParameterValue("ParamMagicNumber")) )
        {
          if (Engine.CurPage<=Engine.TotalPages-1)
            MessageBox.Show("本报表总页数为"+Engine.TotalPages.ToString()+", 但此试用版的软件不允许打印全部的页数! ") ;

          Report.Abort();
        }
      }
    }

No comments: