CreateStreamCallback Delegate


Provides a stream to the ReportViewer control for rendering.

Namespace:   Microsoft.Reporting.WinForms
Assembly:  Microsoft.ReportViewer.WinForms (in Microsoft.ReportViewer.WinForms.dll)


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
Public Delegate Function CreateStreamCallback (
    name As String,
    extension As String,
    encoding As Encoding,
    mimeType As String,
    willSeek As Boolean
) As Stream


  • extension
    Type: System.String

    The file name extension to use if a file stream is being created.

  • encoding
    Type: System.Text.Encoding

    An Encoding enumerator value specifying the character encoding of the stream. This may be null if the stream does not contain characters.

  • mimeType
    Type: System.String

    A string containing the MIME type of the stream.

  • willSeek
    Type: System.Boolean

    A Boolean value indicated whether the stream needs to support seeking. If the value is false, the stream will be forward-only and will be sent to the client in chunks as it is created. If the value is true, the stream may be written in any order.

Return Value

Type: System.IO.Stream

A Stream object to which the ReportViewer control can write data.


This delegate function may be passed into the M:Microsoft.ReportingServices.LocalReport.Render(Microsoft.ReportingServices.ReportRendering.IRenderingExtension,System.String,System.String,Microsoft.ReportingServices.Interfaces.CreateAndRegisterStream,Microsoft.ReportingServices.Warning[]@) method of the P:Microsoft.ReportingServices.WinForms.ReportViewer.LocalReport object to support custom handling of secondary streams. The main body of the report is the first stream that is created.


Legacy Code Example

The following code snippet shows a CreateStreamCallback callback function being passed to the Render method in a console application.

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()
        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)
        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>" + _
        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
    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
        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)
        End If
        AddHandler printDoc.PrintPage, AddressOf PrintPage
    End Sub

    Private Sub Run()
        Dim report As LocalReport = new LocalReport()
        report.ReportPath = "Report.rdlc"
        report.DataSources.Add(new ReportDataSource("Sales", LoadSalesData()))


        m_currentPageIndex = 0
    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
            m_streams = Nothing
        End If
    End Sub

    Public Shared Sub Main(args as string())
        Using demo As Demo = new Demo()
        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();
        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);
        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>" +
        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);

        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)

        PrintDocument printDoc = new PrintDocument(); 
        printDoc.PrinterSettings.PrinterName = printerName;
        if (!printDoc.PrinterSettings.IsValid)
            string msg = String.Format("Can't find printer \"{0}\".", printerName);
        printDoc.PrintPage += new PrintPageEventHandler(PrintPage);

    private void Run()
        LocalReport report = new LocalReport();
        report.ReportPath = "Report.rdlc";
        report.DataSources.Add(new ReportDataSource("Sales", LoadSalesData()));


        m_currentPageIndex = 0;

    public void Dispose()
        if (m_streams != null)
            foreach (Stream stream in m_streams)
            m_streans = null;

    public static int Main(string[] args) 
        using (Demo demo = new Demo())
        return 0;

See Also

Microsoft.Reporting.WinForms Namespace

Return to top