本文為機器翻譯文章。如需檢視英文版,請選取 [原文] 核取方塊。您也可以將滑鼠指標移到文字上,即可在快顯視窗顯示英文原文。
譯文
原文

CreateStreamCallback 委派

 

提供資料流給 ReportViewer 控制項進行轉譯。

命名空間:   Microsoft.Reporting.WebForms
組件:  Microsoft.ReportViewer.WebForms (在 Microsoft.ReportViewer.WebForms.dll 中)

public delegate Stream CreateStreamCallback(
	string name,
	string extension,
	Encoding encoding,
	string mimeType,
	bool willSeek
)

參數

name

資料流的名稱。

extension

如果建立檔案資料流時,所用的副檔名。

encoding

指定資料流字元編碼的 Encoding 列舉值。如果資料流未包含字元,這可能是 null

mimeType

包含資料流 MIME 類型的字串。

willSeek

這是一個 Boolean 值,用來指示資料流是否需要支援搜尋。如果這個值是 false,資料流是順向的,當建立資料流時,會將資料流以區塊的方式傳給用戶端。如果值是 true,就可能依照任何順序來寫入資料流。

傳回值

Type: System.IO.Stream

這是 ReportViewer 控制項可將資料寫入其中的 Stream 物件。

這個委派函式可傳入 P:Microsoft.ReportingServices.WebForms.ReportViewer.LocalReport 物件的 M:Microsoft.ReportingServices.LocalReport.Render(Microsoft.ReportingServices.ReportRendering.IRenderingExtension,System.String,System.String,Microsoft.ReportingServices.Interfaces.CreateAndRegisterStream,Microsoft.ReportingServices.Warning[]@) 方法來支援次要資料流的自訂處理。報表的主體是所建立的第一個資料流。

下列程式碼片段顯示傳遞至 M:Microsoft.ReportingServices.LocalReport.Render(Microsoft.ReportingServices.ReportRendering.IRenderingExtension,System.String,System.String,Microsoft.ReportingServices.Interfaces.CreateAndRegisterStream,Microsoft.ReportingServices.Warning[]@) 方法的 CreateStreamCallback 回呼函式。

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;
    }
}
回到頁首
顯示: