Erstellen einer benutzerdefinierten Laufzeitkomponente für Berichtselemente

Die Laufzeitkomponente für ein benutzerdefiniertes Berichtselement ist in einer Microsoft .NET Framework-Komponente mithilfe einer beliebigen CLS-kompatiblen Sprache implementiert und wird während der Laufzeit vom Prozessor aufgerufen. Sie definieren die Eigenschaften für die Laufzeitkomponente in der Entwurfsumgebung, indem Sie die entsprechende Entwurfszeitkomponente für ein benutzerdefiniertes Berichtselement ändern.

Ein Beispiel für ein vollständig implementiertes benutzerdefiniertes Berichtselement finden Sie unter SQL Server Reporting Services-Produktbeispiele.

Definitions- und Instanzobjekte

Vor der Implementierung eines benutzerdefinierten Berichtselements ist es wichtig, den Unterschied zwischen Definitionsobjekten und Instanzobjekten zu verstehen. Definitionsobjekte stellen die RDL-Darstellung des benutzerdefinierten Berichtselements bereit, wohingegen es sich bei Instanzobjekten um die bewerteten Versionen von Definitionsobjekten handelt. Es gibt nur ein Definitionsobjekt für jedes Element im Bericht. Wenn Sie auf Eigenschaften für ein Definitionsobjekt zugreifen, das Ausdrücke enthält, erhalten Sie die nicht ausgewertete Ausdruckszeichenfolge. Instanzobjekte enthalten die bewerteten Versionen der Definitionsobjekte und können in einer 1:n-Beziehung mit dem Definitionsobjekt eines Elements stehen. 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.

Implementieren der ICustomReportItem-Schnittstelle

Um eine CustomReportItem-Laufzeitkomponente zu erstellen, müssen Sie die Schnittstelle implementieren, die ICustomReportItem in der Microsoft.ReportingServices.ProcessingCore.dll definiert ist:

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

Nachdem Sie die ICustomReportItem Schnittstelle implementiert haben, werden für Sie zwei Methoden-Stubs generiert: GenerateReportItemDefinition und EvaluateReportItemInstance. Die GenerateReportItemDefinition Methode wird zuerst aufgerufen und wird zum Festlegen von Definitionseigenschaften und zum Erstellen des Objekts verwendet, das Image sowohl die Definitions- als auch Instanzeigenschaften enthält, die zum Rendern des Elements verwendet werden. Die EvaluateReportItemInstance Methode wird aufgerufen, nachdem die Definitionsobjekte ausgewertet wurden, und stellt die Instanzobjekte bereit, die zum Rendern des Elements verwendet werden.

Die folgende Beispielimplementierung zeigt ein benutzerdefiniertes Berichtselement, das den Namen des Steuerelements als Bild rendert.

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

Architektur eines benutzerdefinierten Berichtselements
Erstellen einer benutzerdefinierten Entwurfszeitkomponente für Berichtselemente
Benutzerdefinierte Berichtselementklassenbibliotheken
Vorgehensweise: Bereitstellen eines benutzerdefinierten Berichtselements