Udostępnij za pośrednictwem


Tworzenie składnika Run-czas element czasportu niestandardowego

The custom report item run-time component is implemented as a Microsoft .NET Framework component using any CLS-compliant language, and is called by the report processor at run time.Właściwości składnika czas wykonywania definiuje się w środowisku projektowym modyfikując element raportu niestandardowego odpowiedni składnik czas projektowania.

Definicja i wystąpienie obiektów

Przed implementacją element raportu niestandardowego ważne jest zrozumienie różnicy między Definicja obiektów and wystąpienie obiektów.Obiekty definicji zawierają reprezentacja RDL element raportu niestandardowego wystąpienie obiektów jest oceniana wersje obiektów definicji.Istnieje tylko jeden obiekt definicji dla każdego element w raporcie.Podczas uzyskiwania dostępu do właściwości obiektu definicji, które zawierają wyrażenie, zostanie wyświetlony ciąg unevaluated wyrażenie.wystąpienie obiektów znajdują się wersje ocenione obiekty definicji i może mieć relację jeden do wielu z obiektem definicji element.Na przykład jeśli raport ma Tablix obszar danych, zawierający CustomReportItem w wierszu szczegółów, będzie tylko jeden obiekt definicji, ale będzie obiektu wystąpienie dla każdego wiersza w obszarze danych.

Interfejs ICustomReportItem wykonania

Aby utworzyć CustomReportItem składnik czas wykonywania trzeba zaimplementować ICustomReportItem interfejs, który jest zdefiniowany w Microsoft.ReportingServices.ProcessingCore.dll:

namespace Microsoft.ReportingServices.OnDemandReportRendering
{
    public interface ICustomReportItem
    {
        void GenerateReportItemDefinition(CustomReportItem customReportItem);
void EvaluateReportItemInstance(CustomReportItem customReportItem);
    }
}

Po zostało zaimplementowane ICustomReportItem Interfejs dwie metoda procedur wejścia, zostanie wygenerowany automatycznie: GenerateReportItemDefinition i EvaluateReportItemInstance. The GenerateReportItemDefinition metoda is called first and is used for setting definition properties and creating the ImageDefinition object that will contain both the definition and wystąpienie properties that are used for rendering the element. The EvaluateReportItemInstance metoda is called after the definition objects have been evaluated, and it provides the wystąpienie objects that will be used for rendering the element.

Poniżej przedstawiono przykład implementacja element raportu niestandardowy, który pozwala nazwę formantu jako obraz.

namespace Microsoft.Samples.ReportingServices
{
    using System;
    using System.Collections.Generic;
    using System.Collections.Specialized;
    using System.Drawing.Imaging;
    using System.IO;
    using System.Text;
    using Microsoft.ReportingServices.OnDemandReportRendering;

    public class PolygonsCustomReportItem : ICustomReportItem
    {
        #region ICustomReportItem Members

        public void GenerateReportItemDefinition(CustomReportItem cri)
        {
            // Create the Image Definition object that will be 
            // used to render the custom report item
            cri.CreateCriImageDefinition();
            Image polygonImage = (Image)cri.GeneratedReportItem;
        }

        public void EvaluateReportItemInstance(CustomReportItem cri)
        {
            // Get the Image definition
            Image polygonImage = (Image)cri.GeneratedReportItem;

            // Create the image for the custom report item
            polygonImage.ImageInstance.ImageData = DrawImage(cri);
        }

        #endregion

        /// <summary>
        /// Creates an image of the CustomReportItem's name
        /// </summary>
        private byte[] DrawImage(CustomReportItem customReportItem)
        {
            int width = 1;          // pixels
            int height = 1;         // pixels
            int resolution = 75;    // dpi

            System.Drawing.Bitmap bitmap = new System.Drawing.Bitmap(width, height);
            bitmap.SetResolution(resolution, resolution);

            System.Drawing.Graphics graphics = System.Drawing.Graphics.FromImage(bitmap);
            graphics.PageUnit = System.Drawing.GraphicsUnit.Pixel;

            // Get the Font for the Text
            System.Drawing.Font font = new System.Drawing.Font(System.Drawing.FontFamily.GenericMonospace,
                12, System.Drawing.FontStyle.Regular);

            // Get the Brush for drawing the Text
            System.Drawing.Brush brush = new System.Drawing.SolidBrush(System.Drawing.Color.LightGreen);

            // Get the measurements for the image
            System.Drawing.SizeF maxStringSize = graphics.MeasureString(customReportItem.Name, font);
            width = (int)(maxStringSize.Width + 2 * font.GetHeight(resolution));
            height = (int)(maxStringSize.Height + 2 * font.GetHeight(resolution));

            bitmap.Dispose();
            bitmap = new System.Drawing.Bitmap(width, height);
            bitmap.SetResolution(resolution, resolution);

            graphics.Dispose();
            graphics = System.Drawing.Graphics.FromImage(bitmap);
            graphics.PageUnit = System.Drawing.GraphicsUnit.Pixel;
            
            // Draw the text
            graphics.DrawString(customReportItem.Name, font, brush, font.GetHeight(resolution), 
                font.GetHeight(resolution));

            // Create the byte array of the image data
            MemoryStream memoryStream = new MemoryStream();
            bitmap.Save(memoryStream, ImageFormat.Bmp);
            memoryStream.Position = 0;
            byte[] imageData = new byte[memoryStream.Length];
            memoryStream.Read(imageData, 0, imageData.Length);

            return imageData;
        }
    }
}