Creazione di un componente dell'elemento del report personalizzato per la fase di progettazione
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 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). 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.
[!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 ulteriori informazioni sullo sviluppo di componenti tramite .NET Framework, vedere Componenti di Visual Studio in MSDN Library.
Implementazione di un componente per la 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 utilizzati 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 di attributi .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
{
...
Inizializzazione del componente
Le proprietà specificate dall'utente per un elemento del report personalizzato vengono passate mediante una classe Microsoft.ReportDesigner.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 CustomData del componente:
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 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à Visual Studio. Inoltre, è 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.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;
}
}
Utilizzo dei verbi di progettazione
Un verbo di progettazione è un comando di menu collegato a un gestore evento. È 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. È possibile restituire l'elenco dei verbi di progettazione disponibili del componente runtime tramite la proprietà Verbs.
Nell'esempio di codice seguente vengono illustrati un verbo di progettazione e un gestore evento aggiunti a DesignerVerbCollection, oltre al codice del gestore evento:
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 controllo
Le classi di un elemento del 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 Reporting ServicesMicrosoft.ReportDesigner è un'implementazione pass-through della classe Adorner presente in Windows Form. Per la documentazione completa sulla classe Adorner, vedere Cenni preliminari su BehaviorService in MSDN Library. Per un codice di esempio in cui viene implementata una classe Microsoft.ReportDesigner.Design.Adornment, vedere la pagina relativa agli esempi del prodotto per SQL Server Reporting Services.
Per ulteriori informazioni sulla programmazione e sull'utilizzo di Windows Form in Visual Studio, vedere i seguenti argomenti in MSDN Library:
Attributi per componenti in fase di progettazione
Componenti di Visual Studio
Procedura dettagliata: creazione di un controllo di Windows Form che usufruisca delle funzionalità offerte da Visual Studio in fase di progettazione