다음을 통해 공유


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는 위임 사용을 지원하지만 새로운 위임의 선언은 지원하지 않습니다.

매개 변수

  • 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(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;
    }
}

참고 항목

참조

Microsoft.Reporting.WebForms 네임스페이스