CreateStreamCallback 대리자
렌더링할 ReportViewer 컨트롤에 스트림을 제공합니다.
네임스페이스: Microsoft.Reporting.WinForms
어셈블리: Microsoft.ReportViewer.WinForms(Microsoft.ReportViewer.WinForms.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 형식을 포함하는 string입니다.
- willSeek
유형: System.Boolean
스트림이 찾기를 지원해야 하는지 여부를 나타내는 Boolean 값입니다. 값이 false이면 스트림은 정방향 전용이 되고 작성 시 클라이언트에 청크로 전송됩니다. 값이 true이면 임의의 순서로 스트림이 작성될 수 있습니다.
반환 값
유형: System.IO.Stream
ReportViewer 컨트롤이 데이터를 작성할 수 있는 Stream 개체
주의
이 대리자 함수는 LocalReport() 개체의 Render(IRenderingExtension, String, String, CreateAndRegisterStream, array<Warning[]%) 메서드에 전달되어 보조 스트림의 사용자 지정 처리를 지원할 수 있습니다. 보고서의 주 본문이 작성되는 첫 번째 스트림입니다.
예
다음 코드 조각에서는 콘솔 응용 프로그램에서 Render 메서드에 전달되는 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.WinForms
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.WinForms;
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_streans = null;
}
}
public static int Main(string[] args)
{
using (Demo demo = new Demo())
{
demo.Run();
}
return 0;
}
}