1. 程式人生 > >利用資料集在水晶報表中顯示影象的 .NET 程式教程

利用資料集在水晶報表中顯示影象的 .NET 程式教程

目錄

描述
檔案列表
步驟
Form1.cs
VB.NET 版


描述

該 C# .NET Windows 程式演示瞭如何建立資料集,並將影象新增到資料集,以及在執行時將資料集傳遞到子報表。


檔案列表

- bin/Debug/Canada.jpg
- bin/Debug/Germany.jpg
- bin/Debug/Japan.jpg
- bin/Debug/USA.jpg
- App.ico
- AssemblyInfo.cs
- CrystalReport1.cs
- CrystalReport1.rpt
- DynamicImage.csproj
- DynamicImage.csproj.user
- DynamicImage.sln
- Form1.cs
- Form1.resx
- Readme.txt
- Steps.txt


步驟

* 開始一個新專案/建立資料集及其模式

- 新建專案
- 轉到 Form1.cs 後置的程式碼
- Imports System.Data/System.IO
- 建立函式 "CreateData",以建立資料集:

    DataSet CreateData()
    {
        DataSet data = new DataSet();
        data.Tables.Add("Images");
        data.Tables[0].Columns.Add("Country", System.Type.GetType("System.String"));
        data.Tables[0].Columns.Add("img", System.Type.GetType("System.Byte[]"));
        data.WriteXmlSchema(Directory.GetCurrentDirectory() + "//DynamicImage.xsd

");
    }

- 建立函式 "CreateReport",以呼叫 CreateData 建立資料集模式:

    void CreateReport()
    {
        CreateData();
    }

- 在建構函式中呼叫 CreateReport

    public Form1()
    {
        //
        // Required for Windows Form Designer support
        //
        InitializeComponent();

        //
        // TODO: Add any constructor code after InitializeComponent call
        //
        CreateReport();
    }

- 構造並執行程式/將在 Bin/Debug 資料夾中建立 DynamicImage.xsd。


* 設計報表

- 專案->新增新項
- 選擇 Crystal Report,並單擊“開啟”
- 選擇“作為空白報表”,並單擊“確定”
- 右擊任意空白處,選擇“資料庫->新增/刪除資料庫”
- 展開 ODBC (RDO),選擇 Xtreme Sample Database,並單擊“完成”。
- 展開表,雙擊 Customer
- 單擊“確定”
- 將 Customer Name 和 Last Year's Sales 拖放到詳細資料
- 右擊任意空白處,插入->子報表
- 將子報表放置在 Last Year's Sales 旁邊
- 選擇“建立子報表”,並將子報表命名為 "Flags",單擊“報表專家”
- 擴充套件“更多資料來源”,選擇 ADO.NET (XML)
- 找到 DynamicImage.xsd,並單擊“完成”
- 雙擊 Images
- 單擊“下一步”,雙擊 img,單擊“完成”
- 單擊“連結”選項卡
- 雙擊 Country,並單擊“確定”
- 調整子報表的大小
- 在子報表上雙擊,以開啟子報表
- 刪除報表頁首 b 和報表頁尾 b
- 右擊 -> 關閉子報表


* 回到程式碼,並編寫 Crystal 程式碼

- 將 CrystalReportViewer 控制元件拖放到窗體 Form1
- 選擇 CrystalReportViewer1,F4(屬性)
- 改變 Dock 屬性,填充
- 檢視程式碼
- 註釋掉 WriteXmlSchema(因為只在設計報表時需要資料集模式檔案)
- 在 CreateData 函式中組裝資料集,並將其返回

    void AddImageRow(DataTable tbl, string name, string filename)
    {
        FileStream fs = new FileStream(filename, FileMode.Open);
        BinaryReader br = new BinaryReader(fs);
        DataRow row;
        row = tbl.NewRow();
        row[0] = name;
        row[1] = br.ReadBytes((int)br.BaseStream.Length);
        tbl.Rows.Add(row);
        br = null;
        fs = null;
    }

    DataSet CreateData()
    {
        DataSet data = new DataSet();
        data.Tables.Add("Images");
        data.Tables[0].Columns.Add("Country", System.Type.GetType("System.String"));
        data.Tables[0].Columns.Add("img", System.Type.GetType("System.Byte[]"));
        //data.WriteXmlSchema(Directory.GetCurrentDirectory() + "//DynamicImage.xsd");
        AddImageRow(data.Tables[0], "USA", Directory.GetCurrentDirectory() + "//USA.jpg");
        AddImageRow(data.Tables[0], "Canada", Directory.GetCurrentDirectory() + "//Canada.jpg");
        AddImageRow(data.Tables[0], "Germany", Directory.GetCurrentDirectory() + "//Germany.jpg");
        AddImageRow(data.Tables[0], "Japan", Directory.GetCurrentDirectory() + "//Japan.jpg");
        return (data);
    }


- 建立報表文件,將資料集傳遞到子報表,並將報表繫結到水晶報表檢視器:

    void CreateReport()
    {
        CrystalReport1 cr = new CrystalReport1();
        cr.OpenSubreport("Flags").SetDataSource(CreateData());
        crystalReportViewer1.ReportSource = cr;
    }

Form1.cs

using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
using System.IO;

namespace DynamicImage
{
        /// <summary>
        /// Summary description for Form1.
        /// </summary>
        public class Form1 : System.Windows.Forms.Form
        {
                private CrystalDecisions.Windows.Forms.CrystalReportViewer crystalReportViewer1;
                /// <summary>
                /// Required designer variable.
                /// </summary>
                private System.ComponentModel.Container components = null;

                // 過程: AddImageRow
                //       讀取影象檔案,並將其新增到資料集的表中
                //
                //   [in]    tbl         資料表
                //           country     國家名
                //           filename    影象的檔名
                //
                void AddImageRow(DataTable tbl, string name, string filename)
                {
                        FileStream fs = new FileStream(filename, FileMode.Open); // 建立檔案流
                        BinaryReader br = new BinaryReader(fs);    // 建立二進位制讀取器
                        DataRow row;

                        // 建立一個新的資料行
                        row = tbl.NewRow();

                        // 設定 country 欄位和 image 欄位
                        row[0] = name;
                        row[1] = br.ReadBytes((int)br.BaseStream.Length);

                        // 將資料行新增到表中
                        tbl.Rows.Add(row);

                        // 清除
                        br = null;
                        fs = null;
                }

                // 函式: CreateData
                //       建立資料集,包含一個表,表有兩個欄位:Country (string), 和 img (blob/byte[])
                //       為表新增四條記錄
                //
                DataSet CreateData()
                {
                        DataSet data = new DataSet();

                        // 將表 'Images' 新增到資料集
                        data.Tables.Add("Images");

                        // 新增兩個欄位
                        data.Tables[0].Columns.Add("Country", System.Type.GetType("System.String"));
                        data.Tables[0].Columns.Add("img", System.Type.GetType("System.Byte[]"));

                        // 建立資料集模式(該模式用於設計報表)
                        // 報表建立以後,不再需要模式檔案
                        //data.WriteXmlSchema(Directory.GetCurrentDirectory() + "//DynamicImage.xsd");

                        // 新增四行
                        AddImageRow(data.Tables[0], "USA", Directory.GetCurrentDirectory() + "//USA.jpg");
                        AddImageRow(data.Tables[0], "Canada", Directory.GetCurrentDirectory() + "//Canada.jpg");
                        AddImageRow(data.Tables[0], "Germany", Directory.GetCurrentDirectory() + "//Germany.jpg");
                        AddImageRow(data.Tables[0], "Japan", Directory.GetCurrentDirectory() + "//Japan.jpg");

                        return (data);
                }

                // 過程: CreateReport
                //       建立報表,並傳遞資料集
                //
                void CreateReport()
                {
                        // 建立報表
                        CrystalReport1 cr = new CrystalReport1();

                        // 將資料集(通過呼叫函式 CreateData 建立的)傳遞到子報表 "Flags"
                        cr.OpenSubreport("Flags").SetDataSource(CreateData());

                        // 將報表文件傳遞到檢視器
                        crystalReportViewer1.ReportSource = cr;
                }

                public Form1()
                {
                        //
                        // Required for Windows Form Designer support
                        //
                        InitializeComponent();

                        //
                        // TODO: Add any constructor code after InitializeComponent call
                        //
                        CreateReport();
                }
  
                後面的部分省略……


VB.NET 版