使用數(shù)據(jù)集在水晶報(bào)表中顯示圖像的 .NET 程序圖文詳細(xì)教程
發(fā)表時(shí)間:2023-08-17 來源:明輝站整理相關(guān)軟件相關(guān)文章人氣:
[摘要]目錄描述文件列表步驟Form1.csVB.NET 版描述該 C# .NET Windows 程序演示了如何創(chuàng)建數(shù)據(jù)集,并將圖像添加到數(shù)據(jù)集,以及在運(yùn)行時(shí)將數(shù)據(jù)集傳遞到子報(bào)表。文件列表- bin\De...
目錄
描述
文件列表
步驟
Form1.cs
VB.NET 版
描述
該 C# .NET Windows 程序演示了如何創(chuàng)建數(shù)據(jù)集,并將圖像添加到數(shù)據(jù)集,以及在運(yùn)行時(shí)將數(shù)據(jù)集傳遞到子報(bào)表。
文件列表
- 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
步驟
* 開始一個(gè)新項(xiàng)目/創(chuàng)建數(shù)據(jù)集及其模式
- 新建項(xiàng)目
- 轉(zhuǎn)到 Form1.cs 后置的代碼
- Imports System.Data/System.IO
- 創(chuàng)建函數(shù) "CreateData",以創(chuàng)建數(shù)據(jù)集:
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");
}
- 創(chuàng)建函數(shù) "CreateReport",以調(diào)用 CreateData 創(chuàng)建數(shù)據(jù)集模式:
void CreateReport()
{
CreateData();
}
- 在構(gòu)造函數(shù)中調(diào)用 CreateReport
public Form1()
{
//
// Required for Windows Form Designer support
//
InitializeComponent();
//
// TODO: Add any constructor code after InitializeComponent call
//
CreateReport();
}
- 構(gòu)造并執(zhí)行程序/將在 Bin\Debug 文件夾中創(chuàng)建 DynamicImage.xsd。
* 設(shè)計(jì)報(bào)表
- 項(xiàng)目->添加新項(xiàng)
- 選擇 Crystal Report,并單擊“打開”
- 選擇“作為空白報(bào)表”,并單擊“確定”
- 右擊任意空白處,選擇“數(shù)據(jù)庫->添加/刪除數(shù)據(jù)庫”
- 展開 ODBC (RDO),選擇 Xtreme Sample Database,并單擊“完成”。
- 展開表,雙擊 Customer
- 單擊“確定”
- 將 Customer Name 和 Last Year's Sales 拖放到詳細(xì)資料
- 右擊任意空白處,插入->子報(bào)表
- 將子報(bào)表放置在 Last Year's Sales 旁邊
- 選擇“創(chuàng)建子報(bào)表”,并將子報(bào)表命名為 "Flags",單擊“報(bào)表專家”
- 擴(kuò)展“更多數(shù)據(jù)源”,選擇 ADO.NET (XML)
- 找到 DynamicImage.xsd,并單擊“完成”
- 雙擊 Images
- 單擊“下一步”,雙擊 img,單擊“完成”
- 單擊“鏈接”選項(xiàng)卡
- 雙擊 Country,并單擊“確定”
- 調(diào)整子報(bào)表的大小
- 在子報(bào)表上雙擊,以打開子報(bào)表
- 刪除報(bào)表頁眉 b 和報(bào)表頁腳 b
- 右擊 -> 關(guān)閉子報(bào)表
* 回到代碼,并編寫 Crystal 代碼
- 將 CrystalReportViewer 控件拖放到窗體 Form1
- 選擇 CrystalReportViewer1,F(xiàn)4(屬性)
- 改變 Dock 屬性,填充
- 查看代碼
- 注釋掉 WriteXmlSchema(因?yàn)橹辉谠O(shè)計(jì)報(bào)表時(shí)需要數(shù)據(jù)集模式文件)
- 在 CreateData 函數(shù)中組裝數(shù)據(jù)集,并將其返回
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);
}
- 創(chuàng)建報(bào)表文檔,將數(shù)據(jù)集傳遞到子報(bào)表,并將報(bào)表綁定到水晶報(bào)表查看器:
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
// 讀取圖像文件,并將其添加到數(shù)據(jù)集的表中
//
// [in] tbl 數(shù)據(jù)表
// country 國(guó)家名
// filename 圖像的文件名
//
void AddImageRow(DataTable tbl, string name, string filename)
{
FileStream fs = new FileStream(filename, FileMode.Open); // 創(chuàng)建文件流
BinaryReader br = new BinaryReader(fs); // 創(chuàng)建二進(jìn)制讀取器
DataRow row;
// 創(chuàng)建一個(gè)新的數(shù)據(jù)行
row = tbl.NewRow();
// 設(shè)置 country 字段和 image 字段
row[0] = name;
row[1] = br.ReadBytes((int)br.BaseStream.Length);
// 將數(shù)據(jù)行添加到表中
tbl.Rows.Add(row);
// 清除
br = null;
fs = null;
}
// 函數(shù): CreateData
// 創(chuàng)建數(shù)據(jù)集,包含一個(gè)表,表有兩個(gè)字段:Country (string), 和 img (blob/byte[])
// 為表添加四條記錄
//
DataSet CreateData()
{
DataSet data = new DataSet();
// 將表 'Images' 添加到數(shù)據(jù)集
data.Tables.Add("Images");
// 添加兩個(gè)字段
data.Tables[0].Columns.Add("Country", System.Type.GetType("System.String"));
data.Tables[0].Columns.Add("img", System.Type.GetType("System.Byte[]"));
// 創(chuàng)建數(shù)據(jù)集模式(該模式用于設(shè)計(jì)報(bào)表)
// 報(bào)表創(chuàng)建以后,不再需要模式文件
//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
// 創(chuàng)建報(bào)表,并傳遞數(shù)據(jù)集
//
void CreateReport()
{
// 創(chuàng)建報(bào)表
CrystalReport1 cr = new CrystalReport1();
// 將數(shù)據(jù)集(通過調(diào)用函數(shù) CreateData 創(chuàng)建的)傳遞到子報(bào)表 "Flags"
cr.OpenSubreport("Flags").SetDataSource(CreateData());
// 將報(bào)表文檔傳遞到查看器
crystalReportViewer1.ReportSource = cr;
}
public Form1()
{
//
// Required for Windows Form Designer support
//
InitializeComponent();
//
// TODO: Add any constructor code after InitializeComponent call
//
CreateReport();
}
后面的部分省略……