ActiveReport3.0開發

先上圖,最終效果如下:

image

可以連續打印。

具體功能就是大報表裏面再套一個子報表。

考察了幾個報表控件,在b/s下面ActiveReport還是比較好用的,簡單,實用

具體步驟如下:

1、安裝ActiveReports for .NET 3.0 Setup.exe,到官網自己下。

2、用自己的金錢、魅力、或者智慧註冊之~~~~~不註冊也可以用,不過報表上會有紅色字體提示。

3、在項目中新建報表文件

image

4、在新建的報表文件上右鍵選擇“視圖設計器”,直接雙擊的話就會用vs代碼編輯器打開,這裏b/s和c/s是不一樣的。c/s裏面雙擊就是視圖設 計器了。

image

5、和設計網頁一樣,在頁面上佈置各種控件

image

畫完的頁面如下:

image

在左上角的地方有個按鈕,image ,這裏面可以更改報表的信息,如紙張大小、紙張方向等,我選的就是A4紙、橫向

image

這裏不多說了,注意設定好頁面裏面每個地方的綁定字段,另外在右側有一個子報表SubReport,在這裏

image

這個放後面說~~~

點上面的數據庫圖標可以直接連接數據庫進行測試,這個自己試驗就ok,實際應用時都是用代碼控制,這裏控制太不靈活。另外需要說明的一點是,可以在 這裏把測試數據提取出來,方便選擇每個地方的字段~~~不多說了,看圖

image

6、下面開始做現實報表的網頁

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="ZhunKaoZheng.aspx.cs" Inherits="ExamSys.Report.ZhunKaoZheng" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title></title>
    <meta name="GENERATOR" content="Microsoft Visual Studio 7.0">
        <meta name="CODE_LANGUAGE" content="C#">
        <meta name="vs_defaultClientScript" content="VBScript">
        <meta name="vs_targetSchema" content="http://schemas.microsoft.com/intellisense/ie5">
        <link rel="stylesheet" type="text/css" href="default.css">
</head>
<body>
    <form id="ActiveXExport" method="post" runat="server">
        </form>

    <div id="pagebody">

            <object id="arv" codebase="arview2.cab#version=-1,-1,-1,-1" height="800" width="100%"
classid="clsid:8569D715-FF88-44BA-8D1D-AD3E59543DDE" viewastext>
                <param name="_ExtentX" value="26141">
                <param name="_ExtentY" value="11959">
            </object>
            <script language="vbscript">
            <!--
            sub arv_ControlLoaded()
                arv.DataPath = "ZhunKaoZheng.aspx?ReturnReport=1"
            end sub
            -->
            </script>

        </div>
</body>
</html>

需要注意的是我這個控件是引用在form外面的,在裏面不好使哦!!!

還有這個

arv.DataPath = "ZhunKaoZheng.aspx?ReturnReport=1"
是必須加的,記得ZhunKaoZheng.aspx就是本頁面的地址,具體爲什麼加我也不知道,誰知道爲啥記得告訴我哦。
後臺代碼如下:
using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Web;
using System.Web.SessionState;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;
using System.IO;
using DataDynamics.ActiveReports;
using ExamSys.DBUtility;
using System.Data.SQLClient;
using System.Data;

namespace ExamSys.Report
{
    public partial class ZhunKaoZheng : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            string strSQL="";
            if (Session["personid"].ToString() != "" && Session["personid"] != null)
            {

                strSql = @"SELECT T_PERSON.ID, T_PERSON.NAME, T_PERSON.PHOTO,
      T_PERSON.BH_SHENFENZHENG, T_PERSON.BAOMING_NO, T_PERSON.DEP,
      ExamUser.examID, T_PERSON.DEP_BIANHAO,
      T_INFO.NAME AS DEP_NAME, ExamList.elClass
FROM ExamList INNER JOIN
      ExamUser ON ExamList.elID = ExamUser.elID INNER JOIN
      T_PERSON ON ExamUser.personID = T_PERSON.ID INNER JOIN
      T_INFO ON T_PERSON.DEP_BIANHAO = T_INFO.ID
WHERE (T_PERSON.ID = '" + Session["personid"].ToString() + @"')";

            }

            else
            {

                strSql = @"SELECT T_PERSON.ID, T_PERSON.NAME, T_PERSON.PHOTO,
      T_PERSON.BH_SHENFENZHENG, T_PERSON.BAOMING_NO, T_PERSON.DEP,
      ExamUser.examID, T_PERSON.DEP_BIANHAO,
      T_INFO.NAME AS DEP_NAME, ExamList.elClass
FROM ExamList INNER JOIN
      ExamUser ON ExamList.elID = ExamUser.elID INNER JOIN
      T_PERSON ON ExamUser.personID = T_PERSON.ID INNER JOIN
      T_INFO ON T_PERSON.DEP_BIANHAO = T_INFO.ID
WHERE (T_PERSON.DEP_BIANHAO = '" + Session["dep"].ToString() + @"') AND
(ExamUser.elID IN (SELECT ELID FROM EXAMLIST AS EXAMLIST_1 WHERE (ELCLASS = '" + Session["bigtitle"].ToString() + "')))";

            }
            strSql = strSql.Replace("/r", " ").Replace("/n", " ");
            DataSet myDS = SQLHelper.GetDataSet(strSql);
            DataTable myDT = GetDistinctTable(myDS.Tables[0], "id");

            string sReturnReport = this.Page.Request.QueryString["ReturnReport"];
            if ((sReturnReport != null) && (sReturnReport.Trim().Length != 0))
            {
                this.Page.Response.Buffer = true;
                ActiveReport3 rpt = null;
                try
                {
                    //這兩句話是重點
                    rpt = new rptZhunKaoZheng();
                    rpt.DataSource = myDT;
                    rpt.DataMember = myDT.TableName;
                    rpt.Run(false);
                }
                catch (DataDynamics.ActiveReports.ReportException eRunReport)
                {
                    this.Trace.Warn("Report failed to run:/n" + eRunReport.ToString());
                }
                MemoryStream outStream = new MemoryStream();
                rpt.Document.Save(outStream, DataDynamics.ActiveReports.Document.RdfFormat.AR20);
                outStream.Seek(0, SeekOrigin.Begin);
                byte[] bytes = new byte[outStream.Length];
                outStream.Read(bytes, 0, (int)outStream.Length);
                this.Page.Response.ClearContent();
                this.Page.Response.ClearHeaders();
                this.Page.Response.BinaryWrite(bytes);
                this.Page.Response.End();
            }
        }

        /// <summary>
        /// 獲取對固定列不重複的新DataTable
        /// </summary>
        /// <param name="dt">含有重複數據的DataTable</param>
        /// <param name="colName">需要驗證重複的列名</param>
        /// <returns>新的DataTable,colName列不重複,表格式保持不變</returns>
        private DataTable GetDistinctTable(DataTable dt, string colName)
            {
                DataView dv = dt.DefaultView;
                DataTable dtCardNo = dv.ToTable(true, colName);
                DataTable Pointdt = new DataTable();
                Pointdt = dv.ToTable();
                Pointdt.Clear();
                for (int i = 0; i < dtCardNo.Rows.Count; i++  )
                {
                    string ss=dtCardNo.Rows[i][0].ToString();
                    DataRow dr = dt.Select(colName +"="+ ss)[0];
                    Pointdt.Rows.Add(dr.ItemArray);
                }
                return Pointdt;
            }

    }
}

爲了確保能看的清楚,無關的代碼我也不刪除了。裏面最重要的是

rpt = new rptZhunKaoZheng();
rpt.DataSource = myDT;
rpt.DataMember = myDT.TableName;
rpt.Run(false);
7、這樣主報表就現實成功了,下面開始子報表的製作~~

8、同樣的方法建立子報表模板

image

注意裏面的標題欄爲groupHeader,子報表的標題一定要選這個,不然不能在主報表裏面現實,可以右鍵選擇添加、刪除標題欄

image

在裏面設定好需要顯示的字段就O了

9、更改主報表

1)選擇主報表的detail模塊,添加Format事件,這裏面主要設置子報表的DataSource和DataMember

image

        private void detail_Format(object sender, EventArgs e)
        {
            //string strSql1 = "SELECT EXAMLIST.ELNAME, SiteInfo.siName, T_PSSBSchema.seatnum, ExamOrder.eoBegin,
ExamOrder.eoEnd FROM T_PSSBSchema INNER JOIN SiteInfo ON
T_PSSBSchema.siID = SiteInfo.siID INNER JOIN ExamOrder ON
SiteInfo.siID = ExamOrder.siID INNER JOIN EXAMLIST ON T_PSSBSchema.elID = EXAMLIST.ELID
AND ExamOrder.elID = EXAMLIST.ELID WHERE (T_PSSBSchema.examID = '" + this.label9.Text + "')";
            string strSql = @"SELECT ExamList.elName, SiteInfo.siName, ExamUser.seatnum, ExamOrder.eoBegin,
      ExamOrder.eoEnd
FROM ExamUser INNER JOIN
      SiteInfo ON ExamUser.siID = SiteInfo.siID INNER JOIN
      ExamOrder ON SiteInfo.siID = ExamOrder.siID INNER JOIN
      ExamList ON ExamUser.elID = ExamList.elID AND
      ExamOrder.elID = ExamList.elID
WHERE (ExamUser.examID = '" + this.label9.Text + "')";
            strSql = strSql.Replace("/r", " ").Replace("/n", " ");
            DataTable myDT = SQLHelper.GetDataSet(strSql).Tables[0];
            Time2CharConvert(myDT, "eoBegin", "f");
            Time2CharConvert(myDT, "eoEnd", "t");
            this.srptKaoChang.Report.DataSource = myDT;
            this.srptKaoChang.Report.DataMember = myDT.TableName;
            //((DataDynamics.ActiveReports.DataSources.SqlDBDataSource)this.srptKaoChang.Report.DataSource).ConnectionString =
"data source=127.0.0.1;initial
catalog=kuaiji;password=sa;persist security info=True;user id=sa";
            //((DataDynamics.ActiveReports.DataSources.SqlDBDataSource)
this.srptKaoChang.Report.DataSource).SQL =
"SELECT EXAMLIST.ELNAME, SiteInfo.siName, T_PSSBSchema.seatnum, ExamOrder.eoBegin, ExamOrder.eoEnd FROM T_PSSBSchema
INNER JOIN SiteInfo ON T_PSSBSchema.siID = SiteInfo.siID
INNER JOIN ExamOrder ON SiteInfo.siID = ExamOrder.siID INNER JOIN EXAMLIST
ON T_PSSBSchema.elID = EXAMLIST.ELID AND ExamOrder.elID = EXAMLIST.ELID
WHERE (T_PSSBSchema.examID = '" + this.label9.Text + "')";

        }

10、選擇報表主體,添加ReportStart和ReportEnd事件。

image

rptKaoChang _rptKaoChang = null;
        private void rptZhunKaoZheng_ReportStart(object sender, EventArgs e)
        {
            //Check to see if the holder subreport object is assigned, if not create it
            //Creating the subreport here will only create one instance to use
            if (_rptKaoChang == null)
            {
                _rptKaoChang = new rptKaoChang();
                this.srptKaoChang.Report = _rptKaoChang;
                this.srptKaoChang.Report.DataSource = new DataDynamics.ActiveReports.DataSources.SqlDBDataSource();
            }
        }

        private void rptZhunKaoZheng_ReportEnd(object sender, EventArgs e)
        {
            //clean up existing subreport document object
            _rptKaoChang.Document.Dispose();
            //clean up existing subreport object
            _rptKaoChang.Dispose();
            //Reset subreport to null, so if this report is called again it will reinit inside the section format event
            _rptKaoChang = null;
        }

在此進行子報表的初始化和關閉。

11、結束戰鬥,測試OK~~~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章