Creazione di un componente runtime dell'elemento del report personalizzatoCreating a Custom Report Item Run-Time Component

Il componente in fase di esecuzione elemento di report personalizzato viene implementato come un MicrosoftMicrosoft .NET Framework.NET Framework componente utilizzando qualsiasi linguaggio conforme a CLS e viene chiamato dall'elaboratore di report in fase di esecuzione.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. Le proprietà del componente runtime vengono definite nell'ambiente di progettazione modificando il componente della modalità progettazione corrispondente dell'elemento del report personalizzato.You define the properties for the run-time component in the design environment by modifying the custom report item's corresponding design-time component.

Per un esempio di un elemento del report personalizzato completamente implementato, vedere SQL Server Reporting Services Product Samples.For a sample of a fully implemented custom report item, see SQL Server Reporting Services Product Samples.

Oggetti definizione e oggetti istanzaDefinition and Instance Objects

Prima di implementare un elemento del report personalizzato è importante comprendere la differenza tra oggetti definizione e gli oggetti istanza.Before implementing a custom report item it is important to understand the difference between definition objects and instance objects. Gli oggetti definizione forniscono la rappresentazione RDL dell'elemento del report personalizzato mentre gli oggetti istanza sono le versioni valutate degli oggetti definizione.Definition objects provide the RDL representation of the custom report item whereas instance objects are the evaluated versions of the definition objects. È presente un solo oggetto definizione per ogni elemento nel report.There is only one definition object for each item on the report. Quando si accede alle proprietà in un oggetto definizione che contiene espressioni, si otterrà la stringa dell'espressione non valutata.When accessing properties on a definition object that contain expressions, you will get the unevaluated expression string. Gli oggetti istanza contengono le versioni valutate degli oggetti definizione e possono avere una relazione uno-a-molti con l'oggetto definizione di un elemento.Instance objects contain the evaluated versions of the definition objects and can have a one-to-many relationship with an item's definition object. Ad esempio, se un report presenta un'area dati Tablix contenente un CustomReportItem in una riga dettaglio, saranno presenti un solo oggetto definizione e un oggetto istanza per ogni riga nell'area dati.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.

Implementazione dell'interfaccia ICustomReportItemImplementing the ICustomReportItem Interface

Per creare un CustomReportItem componente in fase di esecuzione è necessario implementare la ICustomReportItem interfaccia definita in Microsoft.ReportingServices.ProcessingCore.dll: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);  
    }  
}  

Dopo avere implementato l'interfaccia ICustomReportItem, verranno generati due stub del metodo: GenerateReportItemDefinition e EvaluateReportItemInstance.After you have implemented the ICustomReportItem interface, two method stubs will be generated for you: GenerateReportItemDefinition and EvaluateReportItemInstance. Il metodo GenerateReportItemDefinition viene chiamato per primo e utilizzato per impostare le proprietà di definizione e creare l'oggetto Image che conterrà le proprietà di definizione e di istanza utilizzate per il rendering dell'elemento.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. Il metodo EvaluateReportItemInstance viene chiamato dopo la valutazione degli oggetti definizione e fornisce gli oggetti istanza che verranno utilizzati per il rendering dell'elemento.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.

Di seguito è riportato un esempio di implementazione di un elemento del report personalizzato che esegue il rendering del nome del controllo come immagine.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;  
        }  
    }  
}  

Vedere ancheSee Also

Architettura di un elemento del Report personalizzato Custom Report Item Architecture
Creazione di un componente in fase di progettazione dell'elemento del Report personalizzato Creating a Custom Report Item Design-Time Component
Librerie di classi di elemento di Report personalizzato Custom Report Item Class Libraries
Procedura: distribuire un elemento del Report personalizzatoHow to: Deploy a Custom Report Item