Erstellen einer Laufzeitkomponente für ein benutzerdefiniertes Berichtselement
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- and Instanzobjekte
Bevor Sie ein benutzerdefiniertes Berichtselement implementieren, sollten Sie den Unterschied zwischen Definitionsobjekten und Instanzobjekten kennen. Definitionsobjekte stellen die RDL-Darstellung des benutzerdefinierten Berichtselements bereit, wohingegen es sich bei Instanzobjekten um die bewerteten Versionen von Definitionsobjekten handelt. Für jedes Element des Berichts gibt es nur ein Definitionsobjekt. Beim Zugreifen auf Eigenschaften auf einem Definitionsobjekt, die Ausdrücke enthalten, erhalten Sie die nicht bewertete 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 ICustomReportItem-Schnittstelle implementieren, die in der Datei Microsoft.ReportingServices.ProcessingCore.dll definiert ist:
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. 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. Nachdem die Definitionsobjekte bewertet wurden, wird die EvaluateReportItemInstance-Methode aufgerufen. Sie stellt die Instanzobjekte zum Rendern des Elements bereit.
Im Folgenden sehen Sie eine Beispielimplementierung eines benutzerdefinierten Berichtselements, das den Namen der Steuerung 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;
}
}
}
Siehe auch