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;
}
}
}
Zugehöriger Inhalt
Architektur eines benutzerdefinierten Berichtselements
Erstellen einer benutzerdefinierten Entwurfszeitkomponente für Berichtselemente
Benutzerdefinierte Berichtselementklassenbibliotheken
Vorgehensweise: Bereitstellen eines benutzerdefinierten Berichtselements