Creazione di un componente dell'elemento del report personalizzato per la fase di progettazioneCreating a Custom Report Item Design-Time Component

Un componente dell'elemento del report personalizzato per la fase di progettazione è un controllo che può essere utilizzato nell'ambiente Progettazione report di Visual Studio.A custom report item design-time component is a control that can be used in the Visual Studio Report Designer environment. Il componente dell'elemento del report personalizzato per la fase di progettazione fornisce un'area di progettazione attivata in grado di accettare operazioni di trascinamento della selezione, integrazione con il Visualizzatore proprietà di Visual StudioVisual Studio e la possibilità di fornire editor di proprietà personalizzati.The custom report item design-time component provides an activated design surface that can accept drag-and-drop operations, integration with the Visual StudioVisual Studio property browser, and the ability to provide custom property editors.

Con un componente dell'elemento del report personalizzato per la fase di progettazione, è possibile posizionare un elemento del report personalizzato in un report nell'ambiente di progettazione, impostare proprietà dei dati personalizzate nell'elemento del report personalizzato, quindi salvare l'elemento del report personalizzato come parte del progetto report.With a custom report item design-time component, the user can position a custom report item on a report in the design environment, set custom data properties on the custom report item, and then save the custom report item as part of the report project.

Le proprietà impostate mediante il componente per la fase di progettazione nell'ambiente di sviluppo vengono serializzate e deserializzate dall'ambiente di progettazione host, quindi archiviate come elementi nel file RDL (Report Definition Language).The properties that are set using the design-time component in the development environment are serialized and deserialized by the host design environment and then stored as elements in the Report Definition Language (RDL) file. Quando il report viene eseguito dal componente Elaborazione report, le proprietà impostate mediante il componente per la fase di progettazione vengono passate dal componente Elaborazione report a un componente runtime dell'elemento del report personalizzato che esegue il rendering dell'elemento del report personalizzato e lo passa nuovamente a Elaborazione report.When the report is executed by the report processor, the properties that are set using the design-time component are passed by the report processor to a custom report item run-time component, which renders the custom report item and passes it back to the report processor.

Nota

Il componente dell'elemento del report personalizzato per la fase di progettazione viene implementato come componente MicrosoftMicrosoft .NET Framework.NET Framework.The custom report item design-time component is implemented as a MicrosoftMicrosoft .NET Framework.NET Framework component. In questo documento vengono illustrati dettagli di implementazione specifici del componente dell'elemento del report personalizzato per la fase di progettazione.This document will describe implementation details specific to the custom report item design-time component. Per altre informazioni sullo sviluppo di componenti tramite .NET Framework.NET Framework, vedere Components in Visual Studio (Componenti in Visual Studio) in MSDN Library.For more information about developing components using the .NET Framework.NET Framework, see Components in Visual Studio in the MSDN library.

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

Implementazione di un componente per la fase di progettazioneImplementing a Design-Time Component

La classe principale di un componente dell'elemento del report personalizzato per la fase di progettazione viene ereditata dalla classe Microsoft.ReportDesigner.CustomReportItemDesigner.The main class of a custom report item design-time component is inherited from the Microsoft.ReportDesigner.CustomReportItemDesigner class. Oltre agli attributi standard usati per un controllo .NET Framework.NET Framework, la classe del componente deve definire un attributo CustomReportItem.In addition to the standard attributes used for a .NET Framework.NET Framework control, your component class should define a CustomReportItem attribute. Questo attributo deve corrispondere al nome dell'elemento del report personalizzato secondo la definizione presente nel file reportserver.config.This attribute must correspond to the name of the custom report item as it is defined in the reportserver.config file. Per un elenco di attributi .NET Framework.NET Framework, vedere Attributi nella documentazione di .NET Framework.NET Framework SDK.For a list of .NET Framework.NET Framework attributes, see Attributes in the .NET Framework.NET Framework SDK documentation.

Nell'esempio di codice seguente vengono illustrati gli attributi applicati a un controllo dell'elemento del report personalizzato per la fase di progettazione:The following code example shows attributes being applied to a custom report item design-time control:

namespace PolygonsCRI  
{  
    [LocalizedName("Polygons")]  
    [Editor(typeof(CustomEditor), typeof(ComponentEditor))]  
        [ToolboxBitmap(typeof(PolygonsDesigner),"Polygons.ico")]  
        [CustomReportItem("Polygons")]  

    public class PolygonsDesigner : CustomReportItemDesigner  
    {  
...  

Inizializzazione del componenteInitializing the Component

Le proprietà specificate dall'utente per un elemento del report personalizzato vengono passate mediante una classe CustomData.You pass user-specified properties for a custom report item using a CustomData class. L'implementazione della classe CustomReportItemDesigner deve eseguire l'override del metodo InitializeNewComponent per creare una nuova istanza della classe CustomData del componente e impostarla su valori predefiniti.Your implementation of the CustomReportItemDesigner class should override the InitializeNewComponent method to create a new instance of your component's CustomData class and set it to default values.

Nell'esempio di codice seguente viene illustrata una classe del componente dell'elemento del report personalizzato per la fase di progettazione che esegue l'override del metodo CustomReportItemDesigner.InitializeNewComponent per inizializzare la classe del componente CustomData:The following code example shows an example of a custom report item design-time component class overriding the CustomReportItemDesigner.InitializeNewComponent method to initialize the component's CustomData class:

public override void InitializeNewComponent()  
        {  
            CustomData = new CustomData();  
            CustomData.DataRowHierarchy = new DataHierarchy();  

            // Shape grouping  
            CustomData.DataRowHierarchy.DataMembers.Add(new DataMember());  
            CustomData.DataRowHierarchy.DataMembers[0].Group = new Group();  
            CustomData.DataRowHierarchy.DataMembers[0].Group.Name = Name + "_Shape";  
            CustomData.DataRowHierarchy.DataMembers[0].Group.GroupExpressions.Add(new ReportExpression());  

            // Point grouping  
            CustomData.DataRowHierarchy.DataMembers[0].DataMembers.Add(new DataMember());  
            CustomData.DataRowHierarchy.DataMembers[0].DataMembers[0].Group = new Group();  
            CustomData.DataRowHierarchy.DataMembers[0].DataMembers[0].Group.Name = Name + "_Point";  
            CustomData.DataRowHierarchy.DataMembers[0].DataMembers[0].Group.GroupExpressions.Add(new ReportExpression());  

            // Static column  
            CustomData.DataColumnHierarchy = new DataHierarchy();  
            CustomData.DataColumnHierarchy.DataMembers.Add(new DataMember());  

            // Points  
            IList<IList<DataValue>> dataValues = new List<IList<DataValue>>();  
            CustomData.DataRows.Add(dataValues);  
            CustomData.DataRows[0].Add(new List<DataValue>());  
            CustomData.DataRows[0][0].Add(NewDataValue("X", ""));  
            CustomData.DataRows[0][0].Add(NewDataValue("Y", ""));  
        }  

Modifica delle proprietà del componenteModifying Component Properties

È possibile modificare le proprietà CustomData nell'ambiente di progettazione in diversi modi.You can modify CustomData properties in the design environment in several ways. È possibile modificare qualsiasi proprietà esposta dal componente per la fase di progettazione che sia contrassegnata con l'attributo BrowsableAttribute tramite il visualizzatore proprietà Visual StudioVisual Studio.You can modify any properties that are exposed by the design-time component that are marked with the BrowsableAttribute attribute by using the Visual StudioVisual Studio property browser. È anche possibile modificare le proprietà trascinando elementi nell'area di progettazione dell'elemento del report personalizzato o facendo clic con il pulsante destro del mouse sul controllo nell'ambiente di progettazione e scegliendo Proprietà dal menu di scelta rapida per visualizzare una finestra delle proprietà personalizzata.In addition, you can modify properties by dragging items onto the custom report item's design surface, or by right-clicking the control in the design environment and selecting Properties on the shortcut menu to display a custom properties window.

Nell'esempio di codice seguente viene illustrata una proprietà Microsoft.ReportDesigner.CustomReportItemDesigner.CustomData alla quale è applicato l'attributo BrowsableAttribute:The following code example shows a Microsoft.ReportDesigner.CustomReportItemDesigner.CustomData property that has the BrowsableAttribute attribute applied:

[Browsable(true), Category("Data")]  
public string DataSetName  
{  
      get  
      {  
         return CustomData.DataSetName;  
      }  
      set  
      {  
         CustomData.DataSetName = value;  
      }  
   }  

È possibile associare il componente per la fase di progettazione a una finestra di dialogo dell'editor di proprietà personalizzato.You can provide your design-time component with a custom properties editor dialog box. L'implementazione dell'editor di proprietà personalizzato deve ereditare dalla classe ComponentEditor e creare un'istanza di una finestra di dialogo che può essere utilizzata per la modifica delle proprietà.The custom property editor implementation should inherit from the ComponentEditor class, and it should create an instance of a dialog box that can be used for property editing.

Nell'esempio seguente viene illustrata un'implementazione di una classe che eredita da ComponentEditor e che consente di visualizzare una finestra di dialogo dell'editor di proprietà personalizzato:The following example shows an implementation of a class that inherits from ComponentEditor and displays a custom property editor dialog box:

internal sealed class CustomEditor : ComponentEditor  
{  
   public override bool EditComponent(  
      ITypeDescriptorContext context, object component)  
    {  
     PolygonsDesigner designer = (PolygonsDesigner)component;  
     PolygonProperties dialog = new PolygonProperties();  
     dialog.m_designerComponent = designer;  
     DialogResult result = dialog.ShowDialog();  
     if (result == DialogResult.OK)  
     {  
        designer.Invalidate();  
        designer.ChangeService().OnComponentChanged(designer, null, null, null);  
        return true;  
     }  
     else  
        return false;  
    }  
}  

La finestra di dialogo dell'editor di proprietà personalizzato può richiamare l'Editor espressioni di Progettazione report.Your custom property editor dialog box can invoke the Report Designer Expression Editor. Nell'esempio seguente l'Editor espressioni viene richiamato quando si seleziona il primo elemento nella casella combinata:In the following example, the Expression Editor is invoked when the user selects the first element in the combo box:

private void EditableCombo_SelectedIndexChanged(object sender,   
    EventArgs e)  
{  
   ComboBox combo = (ComboBox)sender;  
   if (combo.SelectedIndex == 0 && m_launchEditor)  
   {  
      m_launchEditor = false;  
      ExpressionEditor editor = new ExpressionEditor();  
      string newValue;  
      newValue = (string)editor.EditValue(null, m_designerComponent.Site, m_oldComboValue);  
      combo.Items[0] = newValue;  
   }  
}  

Utilizzo dei verbi di progettazioneUsing Designer Verbs

Un verbo di progettazione è un comando di menu collegato a un gestore evento.A designer verb is a menu command linked to an event handler. È possibile aggiungere verbi di progettazione da visualizzare nel menu di scelta rapida di un componente quando il controllo di runtime di un elemento del report personalizzato viene utilizzato nell'ambiente di progettazione.You can add designer verbs that will appear in a component's shortcut menu when your custom report item run-time control is being used in the design environment. È possibile restituire l'elenco dei verbi di progettazione disponibili del componente runtime tramite la proprietà Verbs.You can return the list of available designer verbs from your run-time component by using the Verbs property.

Nell'esempio di codice seguente vengono illustrati un verbo di progettazione e un gestore evento aggiunti a DesignerVerbCollection, oltre al codice del gestore evento:The following code example shows a designer verb and an event handler being added to the DesignerVerbCollection, as well as the event handler code:

public override DesignerVerbCollection Verbs  
{  
    get  
    {  
        if (m_verbs == null)  
        {  
            m_verbs = new DesignerVerbCollection();  
            m_verbs.Add(new DesignerVerb("Proportional Scaling", new EventHandler(OnProportionalScaling)));  
         m_verbs[0].Checked = (GetCustomProperty("poly:Proportional") == bool.TrueString);  
        }  

        return m_verbs;  
    }  
}  

private void OnProportionalScaling(object sender, EventArgs e)  
{  
   bool proportional = !  
        (GetCustomProperty("poly:Proportional") == bool.TrueString);  
   m_verbs[0].Checked = proportional;  
   SetCustomProperty("poly:Proportional", proportional.ToString());  
   ChangeService().OnComponentChanged(this, null, null, null);  
   Invalidate();  
}  

Utilizzo delle aree di controlloUsing Adornments

Le classi elemento report personalizzato possono anche implementare una classe Microsoft.ReportDesigner.Design.Adornment.Custom report item classes can also implement a Microsoft.ReportDesigner.Design.Adornment class. Un'area di controllo consente al controllo dell'elemento del report personalizzato di fornire aree esterne al rettangolo principale dell'area di progettazione.An adornment allows the custom report item control to provide areas outside the main rectangle of the design surface. Tali aree possono gestire eventi dell'interfaccia utente, quali clic del mouse e operazioni di trascinamento della selezione.These areas can handle user interface events, such as mouse clicks and drag-and-drop operations. La classe Adornment definita nello spazio dei nomi Reporting ServicesReporting Services Microsoft.ReportDesigner è un'implementazione pass-through della classe Adorner presente in Windows Forms.The Adornment class that is defined in the Reporting ServicesReporting Services Microsoft.ReportDesigner namespace is a pass-through implementation of the Adorner class found in Windows Forms. Per la documentazione completa sulla classe Adorner, vedere Cenni preliminari su BehaviorService in MSDN Library.For complete documentation on the Adorner class, see Behavior Service Overview in the MSDN library. Per codice di esempio che implementa una classe Microsoft.ReportDesigner.Design.Adornment, vedere SQL Server Reporting Services Product Samples (Esempi di prodotto SQL Server Reporting Services).For sample code that implements a Microsoft.ReportDesigner.Design.Adornment class, see SQL Server Reporting Services Product Samples.

Per ulteriori informazioni sulla programmazione e sull'utilizzo di Windows Form in Visual StudioVisual Studio, vedere i seguenti argomenti in MSDN Library:For more information about programming and using Windows Forms in Visual StudioVisual Studio, see these topics in the MSDN Library:

  • Attributi per componenti in fase di progettazioneDesign-Time Attributes for Components

  • Componenti di Visual StudioVisual StudioComponents in Visual StudioVisual Studio

  • Procedura dettagliata: creazione di un controllo di Windows Form che usufruisca delle caratteristiche offerte da Visual Studio in fase di progettazioneWalkthrough: Creating a Windows Forms Control that Takes Advantage of Visual Studio Design-Time Features

Vedere ancheSee Also

Architettura di un elemento del report personalizzato Custom Report Item Architecture
Creazione di un componente runtime dell'elemento del report personalizzato Creating a Custom Report Item Run-Time Component
Librerie di classi dell'elemento del report personalizzato Custom Report Item Class Libraries
Procedura: Distribuzione di un elemento del report personalizzatoHow to: Deploy a Custom Report Item