Erstellen einer Laufzeitkomponente für ein benutzerdefiniertes BerichtselementCreating a Custom Report Item Run-Time Component

Die Laufzeitkomponente für ein benutzerdefiniertes Berichtselement ist in einer MicrosoftMicrosoft .NET Framework.NET Framework-Komponente mithilfe einer beliebigen CLS-kompatiblen Sprache implementiert und wird während der Laufzeit vom Prozessor aufgerufen.The custom report item run-time component is implemented as a MicrosoftMicrosoft .NET Framework.NET Framework component using any CLS-compliant language, and is called by the report processor at run time. Sie definieren die Eigenschaften für die Laufzeitkomponente in der Entwurfsumgebung, indem Sie die entsprechende Entwurfszeitkomponente für ein benutzerdefiniertes Berichtselement ändern.You define the properties for the run-time component in the design environment by modifying the custom report item's corresponding design-time component.

Ein Beispiel für ein vollständig implementiertes benutzerdefiniertes Berichtselement finden Sie unter SQL Server Reporting Services-Produktbeispiele.For a sample of a fully implemented custom report item, see SQL Server Reporting Services Product Samples.

Definitions- and InstanzobjekteDefinition and Instance Objects

Bevor Sie ein benutzerdefiniertes Berichtselement implementieren, sollten Sie den Unterschied zwischen Definitionsobjekten und Instanzobjekten kennen.Before implementing a custom report item it is important to understand the difference between definition objects and instance objects. Definitionsobjekte stellen die RDL-Darstellung des benutzerdefinierten Berichtselements bereit, wohingegen es sich bei Instanzobjekten um die bewerteten Versionen von Definitionsobjekten handelt.Definition objects provide the RDL representation of the custom report item whereas instance objects are the evaluated versions of the definition objects. Für jedes Element des Berichts gibt es nur ein Definitionsobjekt.There is only one definition object for each item on the report. Beim Zugreifen auf Eigenschaften auf einem Definitionsobjekt, die Ausdrücke enthalten, erhalten Sie die nicht bewertete Ausdruckszeichenfolge.When accessing properties on a definition object that contain expressions, you will get the unevaluated expression string. Instanzobjekte enthalten die bewerteten Versionen der Definitionsobjekte und können in einer 1:n-Beziehung mit dem Definitionsobjekt eines Elements stehen.Instance objects contain the evaluated versions of the definition objects and can have a one-to-many relationship with an item's definition object. Wenn beispielsweise ein Bericht einen Tablix-Datenbereich besitzt, der ein CustomReportItem in einer Detailzeile enthält, ist nur ein einziges Definitionsobjekt vorhanden, es gibt jedoch für jede Zeile im Datenbereich eine Instanz.For example, if a report has a Tablix data region that contains a CustomReportItem in a detail row, there will be only one definition object but there will be an instance object for each row in the data region.

Implementieren der ICustomReportItem-SchnittstelleImplementing the ICustomReportItem Interface

Um ein CustomReportItem zu erstellen, müssen Sie die ICustomReportItem-Schnittstelle implementieren, die in der Datei „Microsoft.ReportingServices.ProcessingCore.dll“ definiert ist:To create a CustomReportItem run-time component you will need to implement the ICustomReportItem interface that is defined in the Microsoft.ReportingServices.ProcessingCore.dll:

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

Nachdem die ICustomReportItem-Schnittstelle implementiert ist, werden zwei Methodenstubs generiert: GenerateReportItemDefinition und EvaluateReportItemInstance.After you have implemented the ICustomReportItem interface, two method stubs will be generated for you: GenerateReportItemDefinition and EvaluateReportItemInstance. Die GenerateReportItemDefinition-Methode wird zuerst aufgerufen. Sie wird zum Festlegen der Definitionseigenschaften and zum Erstellen des Image-Objekts verwendet, das sowohl die zum Rendern des Elements verwendeten Definitions- und die Instanzeigenschaften enthält.The GenerateReportItemDefinition method is called first and is used for setting definition properties and creating the Image object that will contain both the definition and instance properties that are used for rendering the item. Nachdem die Definitionsobjekte bewertet wurden, wird die EvaluateReportItemInstance-Methode aufgerufen. Sie stellt die Instanzobjekte zum Rendern des Elements bereit.The EvaluateReportItemInstance method is called after the definition objects have been evaluated, and it provides the instance objects that will be used for rendering the item.

Im Folgenden sehen Sie eine Beispielimplementierung eines benutzerdefinierten Berichtselements, das den Namen der Steuerung als Bild rendert.The following is an example implementation of a custom report item that renders the name of the control as an image.

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 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;  
        }  
    }  
}  

Weitere InformationenSee Also

Custom Report Item Architecture (Architektur des benutzerdefinierten Berichtselements) Custom Report Item Architecture
Erstellen einer Entwurfszeitkomponente für ein benutzerdefiniertes Berichtselement Creating a Custom Report Item Design-Time Component
Custom Report Item Class Libraries (Klassenbibliotheken für ein benutzerdefiniertes Berichtselement) Custom Report Item Class Libraries
Vorgehensweise: Bereitstellen eines benutzerdefinierten BerichtselementsHow to: Deploy a Custom Report Item