Creazione di un componente personalizzato della fase di progettazione dell'elemento del report

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. 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 Studio e la possibilità di fornire editor di proprietà personalizzati.

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.

Le proprietà impostate utilizzando il componente in fase di progettazione nell'ambiente di sviluppo vengono serializzate e deserializzate dall'ambiente di progettazione host. Le proprietà vengono quindi archiviate come elementi nel file RDL (Report Definition Language). Quando l'elaboratore di report esegue il report, le proprietà impostate utilizzando il componente in fase di progettazione vengono passate dal processore di report a un componente di runtime dell'elemento del report personalizzato, che esegue il rendering dell'elemento del report personalizzato e lo passa al processore di report.

Nota

Il componente dell'elemento del report personalizzato per la fase di progettazione viene implementato come componente Microsoft .NET Framework. In questo documento vengono illustrati dettagli di implementazione specifici del componente dell'elemento del report personalizzato per la fase di progettazione.

Per un esempio di elemento del report personalizzato completamente implementato, vedere SQL Server Reporting Services Product Samples (Esempi del prodotto SQL Server Reporting Services).

Implementare un componente in fase di progettazione

La classe principale di un componente dell'elemento del report personalizzato per la fase di progettazione viene ereditata dalla classe Microsoft.ReportDesigner.CustomReportItemDesigner. Oltre agli attributi standard usati per un controllo .NET Framework, la classe del componente deve definire un attributo CustomReportItem. Questo attributo deve corrispondere al nome dell'elemento del report personalizzato secondo la definizione presente nel file reportserver.config. Per un elenco degli attributi di .NET Framework, vedere Attributi nella documentazione di .NET Framework SDK.

Nell'esempio di codice seguente vengono illustrati gli attributi applicati a un controllo dell'elemento del report personalizzato per la fase di progettazione:

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

Inizializzare il componente

Le proprietà specificate dall'utente per un elemento del report personalizzato vengono passate mediante una classe CustomData. 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.

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:

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", ""));  
        }  

Modificare le proprietà del componente

È possibile modificare le proprietà CustomData nell'ambiente di progettazione in diversi modi. È possibile modificare qualsiasi proprietà esposta dal componente per la fase di progettazione che sia contrassegnata con l'attributo BrowsableAttribute tramite il visualizzatore proprietà di Visual Studio. È 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.

Nell'esempio di codice seguente viene illustrata una proprietà Microsoft.ReportDesigner.CustomReportItemDesigner.CustomData alla quale è applicato l'attributo BrowsableAttribute:

[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. 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à.

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:

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. Nell'esempio seguente l'Editor espressioni viene richiamato quando si seleziona il primo elemento nella casella combinata:

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

Usare i verbi della finestra di progettazione

Un verbo di progettazione è un comando di menu collegato a un gestore evento. È possibile aggiungere verbi della finestra di progettazione visualizzati nel menu di scelta rapida di un componente quando viene usato il controllo runtime dell'elemento del report personalizzato nell'ambiente di progettazione. È possibile restituire l'elenco dei verbi di progettazione disponibili del componente runtime tramite la proprietà Verbs.

Nell'esempio di codice seguente viene illustrato un verbo della finestra di progettazione e un gestore eventi da aggiungere a DesignerVerbCollection. L'esempio mostra anche il codice del gestore eventi:

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

Usare gli strumenti decorativi

Le classi elemento report personalizzato possono anche implementare una classe Microsoft.ReportDesigner.Design.Adornment. Un'area di controllo consente al controllo dell'elemento del report personalizzato di fornire aree esterne al rettangolo principale dell'area di progettazione. Tali aree possono gestire eventi dell'interfaccia utente, quali clic del mouse e operazioni di trascinamento della selezione. La classe Adornment definita nello spazio dei nomi Microsoft.ReportDesigner è un'implementazione pass-through della classe Adorner presente in Windows Forms. Per la documentazione completa sulla classe Adorner, vedere Cenni preliminari su BehaviorService in 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).

Per altre informazioni sulla programmazione e sull'uso di Windows Form in Visual Studio, vedere questi articoli in MSDN Library:

  • Attributi per componenti in fase di progettazione

  • Componenti in Visual Studio

  • Procedura dettagliata: creazione di un controllo di Windows Form che usufruisca delle caratteristiche offerte da Visual Studio in fase di progettazione

Architettura dell'elemento del report personalizzato
Creazione di un componente di runtime dell'elemento del report personalizzato
Librerie di classi degli elementi del report personalizzate
Procedura: Distribuire un elemento del report personalizzato