CreateStreamCallback 委派
提供資料流給 ReportViewer 控制項進行轉譯。
命名空間: Microsoft.Reporting.WebForms
組件: Microsoft.ReportViewer.WebForms (在 Microsoft.ReportViewer.WebForms.dll 中)
語法
'宣告
Public Delegate Function CreateStreamCallback ( _
name As String, _
extension As String, _
encoding As Encoding, _
mimeType As String, _
willSeek As Boolean _
) As Stream
'用途
Dim instance As New CreateStreamCallback(AddressOf HandlerMethod)
public delegate Stream CreateStreamCallback(
string name,
string extension,
Encoding encoding,
string mimeType,
bool willSeek
)
public delegate Stream^ CreateStreamCallback(
String^ name,
String^ extension,
Encoding^ encoding,
String^ mimeType,
bool willSeek
)
type CreateStreamCallback =
delegate of
name:string *
extension:string *
encoding:Encoding *
mimeType:string *
willSeek:bool -> Stream
JScript 支援使用委派,但不支援新的宣告。
參數
- name
型別:System.String
資料流的名稱。
- extension
型別:System.String
如果建立檔案資料流時,所用的副檔名。
- encoding
型別:System.Text.Encoding
指定資料流字元編碼的 Encoding 列舉值。如果資料流未包含字元,這可能是 nullnull 參考 (在 Visual Basic 中為 Nothing)。
- mimeType
型別:System.String
包含資料流 MIME 類型的字串。
- willSeek
型別:System.Boolean
這是一個 Boolean 值,用來指示資料流是否需要支援搜尋。如果這個值是 false,資料流是順向的,當建立資料流時,會將資料流以區塊的方式傳給用戶端。如果值是 true,就可能依照任何順序來寫入資料流。
傳回值
型別:System.IO.Stream
這是 ReportViewer 控制項可將資料寫入其中的 Stream 物件。
備註
這個委派函式可傳入 LocalReport() 物件的 Render(IRenderingExtension, String, String, CreateAndRegisterStream, array<Warning[]%) 方法來支援次要資料流的自訂處理。報表的主體是所建立的第一個資料流。
範例
下列程式碼片段顯示傳遞至 Render(IRenderingExtension, String, String, CreateAndRegisterStream, array<Warning[]%) 方法的 CreateStreamCallback 回呼函式。
Imports System.IO
Imports System.Data
Imports System.Text
Imports System.Drawing.Imaging
Imports System.Drawing.Printing
Imports System.Collections.Generic
Imports Microsoft.Reporting.WebForms
Public Class Demo
Implements IDisposable
private m_currentPageIndex As Integer
private m_streams As IList(Of Stream)
Private Function LoadSalesData() As DataTable
Dim dataSet As New DataSet()
dataSet.ReadXml("data.xml")
Return dataSet.Tables(0)
End Function
Private Function CreateStream(name As String, _
fileNameExtension As String, _
encoding As Encoding, mimeType As String, _
willSeek As Boolean) As Stream
Dim stream As Stream = New FileStream(name + "." + fileNameExtension, FileMode.Create)
m_streams.Add(stream)
Return stream
End Function
Private Sub Export(report As LocalReport)
Dim deviceInfo As string = _
"<DeviceInfo>" + _
" <OutputFormat>EMF</OutputFormat>" + _
" <PageWidth>8.5in</PageWidth>" + _
" <PageHeight>11in</PageHeight>" + _
" <MarginTop>0.25in</MarginTop>" + _
" <MarginLeft>0.25in</MarginLeft>" + _
" <MarginRight>0.25in</MarginRight>" + _
" <MarginBottom>0.25in</MarginBottom>" + _
"</DeviceInfo>"
Dim warnings() As Warning = Nothing
m_streams = New List(Of Stream)()
report.Render("Image", deviceInfo, _
AddressOf CreateStream, warnings)
Dim stream As Stream
For Each stream In m_streams
stream.Position = 0
Next
End Sub
Private Sub PrintPage(sender As Object, ev As PrintPageEventArgs)
Dim pageImage As New Metafile(m_streams(m_currentPageIndex))
ev.Graphics.DrawImage(pageImage, ev.PageBounds)
m_currentPageIndex += 1
ev.HasMorePages = (m_currentPageIndex < m_streams.Count)
End Sub
Private Sub Print()
Const printerName As String = "Microsoft Office Document Image Writer"
If m_streams Is Nothing Or m_streams.Count = 0 Then
Return
End If
Dim printDoc As New PrintDocument()
printDoc.PrinterSettings.PrinterName = printerName
If Not printDoc.PrinterSettings.IsValid Then
Dim msg As String = String.Format(_
"Can't find printer ""{0}"".", printerName)
Console.WriteLine(msg)
Return
End If
AddHandler printDoc.PrintPage, AddressOf PrintPage
printDoc.Print()
End Sub
Private Sub Run()
Dim report As LocalReport = new LocalReport()
report.ReportPath = "Report.rdlc"
report.DataSources.Add(new ReportDataSource("Sales", LoadSalesData()))
Export(report)
m_currentPageIndex = 0
Print()
End Sub
Public Overloads Sub Dispose() Implements IDisposable.Dispose
If Not (m_streams Is Nothing) Then
Dim stream As Stream
For Each stream In m_streams
stream.Close()
Next
m_streams = Nothing
End If
End Sub
Public Shared Sub Main(args as string())
Using demo As Demo = new Demo()
demo.Run()
End Using
End Sub
End Class
using System;
using System.IO;
using System.Data;
using System.Text;
using System.Drawing.Imaging;
using System.Drawing.Printing;
using System.Collections.Generic;
using Microsoft.Reporting.WebForms;
public class Demo : IDisposable
{
private int m_currentPageIndex;
private IList<Stream> m_streams;
private DataTable LoadSalesData()
{
DataSet dataSet = new DataSet();
dataSet.ReadXml("data.xml");
return dataSet.Tables[0];
}
private Stream CreateStream(string name, string fileNameExtension,
Encoding encoding,
string mimeType, bool willSeek)
{
Stream stream = new FileStream(name + "." + fileNameExtension,
FileMode.Create);
m_streams.Add(stream);
return stream;
}
private void Export(LocalReport report)
{
string deviceInfo =
"<DeviceInfo>" +
" <OutputFormat>EMF</OutputFormat>" +
" <PageWidth>8.5in</PageWidth>" +
" <PageHeight>11in</PageHeight>" +
" <MarginTop>0.25in</MarginTop>" +
" <MarginLeft>0.25in</MarginLeft>" +
" <MarginRight>0.25in</MarginRight>" +
" <MarginBottom>0.25in</MarginBottom>" +
"</DeviceInfo>";
Warning[] warnings;
m_streams = new List<Stream>();
report.Render("Image", deviceInfo, CreateStream, out warnings);
foreach (Stream stream in m_streams)
stream.Position = 0;
}
private void PrintPage(object sender, PrintPageEventArgs ev)
{
Metafile pageImage = new Metafile(m_streams[m_currentPageIndex]);
ev.Graphics.DrawImage(pageImage, 0, 0);
m_currentPageIndex++;
ev.HasMorePages = (m_currentPageIndex < m_streams.Count);
}
private void Print()
{
const string printerName = "Microsoft Office Document Image
Writer";
if (m_streams == null || m_streams.Count == 0)
return;
PrintDocument printDoc = new PrintDocument();
printDoc.PrinterSettings.PrinterName = printerName;
if (!printDoc.PrinterSettings.IsValid)
{
string msg = String.Format("Can't find printer \"{0}\".",
printerName);
Console.WriteLine(msg);
return;
}
printDoc.PrintPage += new PrintPageEventHandler(PrintPage);
printDoc.Print();
}
private void Run()
{
LocalReport report = new LocalReport();
report.ReportPath = "Report.rdlc";
report.DataSources.Add(new ReportDataSource("Sales",
LoadSalesData()));
Export(report);
m_currentPageIndex = 0;
Print();
}
public void Dispose()
{
if (m_streams != null)
{
foreach (Stream stream in m_streams)
stream.Close();
m_streams = null;
}
}
public static int Main(string[] args)
{
using (Demo demo = new Demo())
{
demo.Run();
}
return 0;
}
}