CreateStreamCallback Delegate

Provides a stream to the ReportViewer control for rendering.

Namespace: Microsoft.Reporting.WebForms
Assembly: Microsoft.ReportViewer.WebForms (in microsoft.reportviewer.webforms.dll)

'Declaration
Public Delegate Function CreateStreamCallback ( _
	name As String, _
	extension As String, _
	encoding As Encoding, _
	mimeType As String, _
	willSeek As Boolean _
) As Stream
'Usage
Dim instance As New CreateStreamCallback(AddressOf HandlerMethod)
/** @delegate */
public delegate Stream CreateStreamCallback (
	String name, 
	String extension, 
	Encoding encoding, 
	String mimeType, 
	boolean willSeek
)
JScript supports the use of delegates, but not the declaration of new ones.

Parameters

name

The name of the stream.

extension

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

encoding

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

mimeType

A string containing the MIME type of the stream.

willSeek

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

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

This delegate function may be passed into the Render method of the LocalReport object to support custom handling of secondary streams. The main body of the report is the first stream that is created.

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

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
Show: