Delegato CreateStreamCallback
Restituisce al controllo ReportViewer un flusso per il rendering.
Spazio dei nomi Microsoft.Reporting.WebForms
Assembly: Microsoft.ReportViewer.WebForms (in Microsoft.ReportViewer.WebForms.dll)
Sintassi
'Dichiarazione
Public Delegate Function CreateStreamCallback ( _
name As String, _
extension As String, _
encoding As Encoding, _
mimeType As String, _
willSeek As Boolean _
) As Stream
'Utilizzo
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 supporta l'utilizzo di delegati, ma non la dichiarazione di nuovi delegati.
Parametri
- name
Tipo: System.String
Nome del flusso.
- extension
Tipo: System.String
Estensione da utilizzare se viene creato un flusso di file.
- encoding
Tipo: System.Text.Encoding
Valore di enumeratore Encoding che specifica la codifica dei caratteri del flusso. Il valore può essere nullriferimento Null (Nothing in Visual Basic). se il flusso non contiene caratteri.
- mimeType
Tipo: System.String
Valore String contenente il tipo MIME del flusso.
- willSeek
Tipo: System.Boolean
Valore Boolean che indica se il flusso deve supportare la ricerca. Se ha valore false, il flusso sarà forward-only e verrà inviato al client in blocchi durante la creazione. Se ha valore true, è possibile scrivere nel flusso in qualsiasi ordine.
Valore restituito
Tipo: System.IO.Stream
Oggetto Stream in cui il controllo ReportViewer può scrivere dati.
Osservazioni
È possibile passare questa funzione di delegato nel metodo Render(IRenderingExtension, String, String, CreateAndRegisterStream, array<Warning[]%) dell'oggetto LocalReport() per supportare la gestione personalizzata dei flussi secondari. Il primo flusso creato è il corpo principale del rapporto.
Esempi
Nel frammento di codice seguente una funzione di richiamata CreateStreamCallback viene passata al metodo Render(IRenderingExtension, String, String, CreateAndRegisterStream, array<Warning[]%).
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;
}
}