Crear un componente de tiempo de diseño de elemento de informe personalizado

Un componente de tiempo de diseño de elemento de informe personalizado es un control que se puede usar en el entorno de Visual Studio Report Designer. El componente de tiempo de diseño de elemento de informe personalizado proporciona una superficie de diseño activada que puede aceptar las operaciones de arrastrar y colocar, la integración con el explorador de propiedades de Visual Studio, y la capacidad de proporcionar los editores de propiedades personalizados.

Con un componente de tiempo de diseño de elemento de informe personalizado, el usuario puede colocar un elemento de informe personalizado en un informe en el entorno de diseño, establecer las propiedades de datos personalizadas en el elemento de informe personalizado y, a continuación, guardar el elemento de informe personalizado como parte del proyecto de informe.

Las propiedades que se establecen utilizando el componente de tiempo de diseño en el entorno de desarrollo se serializan y deserializan por el entorno de diseño del host y, a continuación, se guardan como elementos en el archivo de lenguaje RDL (Report Definition Language). Cuando el procesador de informes ejecuta el informe, pasa las propiedades que están establecidas utilizando el componente de tiempo de diseño a un componente de tiempo de ejecución del elemento de informe personalizado, que representa el elemento de informe personalizado y lo devuelve al procesador de informes.

Nota

El componente de tiempo de diseño de elemento de informe personalizado se implementa como un componente Microsoft .NET Framework. En este documento se describirán los detalles de la implementación específicos al componente de tiempo de diseño del elemento de informe personalizado. Para obtener más información acerca de cómo desarrollar componentes mediante .NET Framework, vea Componentes en Visual Studio en MSDN Library.

Para obtener una muestra de un elemento de informe personalizado implementado totalmente, vea Muestras de productos de SQL Server Reporting Services.

Implementar un componente de tiempo de diseño

La clase principal de un componente de tiempo de diseño de elemento de informe personalizado está heredada de la clase Microsoft.ReportDesigner.CustomReportItemDesigner. Además de los atributos estándar usados para un control .NET Framework, la clase de componente debería definir un atributo CustomReportItem. Este atributo debe corresponder al nombre del elemento de informe personalizado como se define en el archivo reportserver.config. Para obtener una lista de atributos .NET Framework, vea Atributos en la documentación de .NET Framework SDK.

El ejemplo de código siguiente muestra atributos que se aplican a un control de tiempo de diseño del elemento de informe personalizado:

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

    public class PolygonsDesigner : CustomReportItemDesigner
    {
...

Inicializar el componente

Las propiedades especificadas por el usuario para un elemento de informe personalizado se pasan utilizando una clase CustomData. La implementación de la clase CustomReportItemDesigner debería invalidar el método InitializeNewComponent para crear una nueva instancia de la clase CustomData del componente y establecerla en los valores predeterminados.

El ejemplo de código siguiente muestra un ejemplo de un una clase de componente de tiempo de diseño de elemento de informe personalizado que invalida el método CustomReportItemDesigner.InitializeNewComponent para inicializar la clase 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", ""));
        }

Modificar propiedades de componentes

Puede modificar las propiedades CustomData en el entorno de diseño de varias maneras. Puede modificar cualquier propiedad que expuesta por el componente de tiempo de diseño que esté marcada con el atributo BrowsableAttribute utilizando el explorador de propiedades de Visual Studio. Además, puede modificar las propiedades arrastrando los elementos a la superficie de diseño del elemento de informe personalizado o haciendo clic con el botón secundario en el control en el entorno de diseño y seleccionando Propiedades en el menú contextual para mostrar una ventana de propiedades personalizada.

El ejemplo de código siguiente muestra una propiedad Microsoft.ReportDesigner.CustomReportItemDesigner.CustomData que tiene el atributo BrowsableAttribute aplicado:

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

Puede proporcionar un cuadro de diálogo de editor de propiedades personalizado al componente de tiempo de diseño. La implementación personalizada del editor de propiedades debería heredar de la clase ComponentEditor y debería crear una instancia de un cuadro de diálogo que se puede usar para la edición de propiedad.

En el ejemplo siguiente se muestra una implementación de una clase que hereda de ComponentEditor y muestra un cuadro de diálogo de editor de propiedades personalizado:

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

El cuadro de diálogo de editor de propiedades personalizado puede invocar al editor de expresiones del diseñador de informes. En el ejemplo siguiente, el editor de expresiones se invoca cuando el usuario selecciona el primer elemento del cuadro combinado:

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

Utilizar los verbos de diseñador

Un verbo de diseñador es un comando de menú vinculado a un controlador de eventos. Puede agregar verbos de diseñador que aparecerán en el menú contextual de un componente cuando el control de tiempo de ejecución del elemento de informe personalizado se usa en el entorno de diseño. Puede devolver la lista de verbos de diseñador disponibles desde el componente de tiempo de ejecución utilizando la propiedad Verbs.

El ejemplo de código siguiente muestra un verbo de diseñador y un controlador de eventos agregados a DesignerVerbCollection, así como el código de controlador de eventos:

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

Utilizar las opciones gráficas

Las clases de elemento de informe personalizado también pueden implementar una clase Microsoft.ReportDesigner.Design.Adornment. Una opción gráfica permite al control de elemento de informe personalizado proporcionar las áreas fuera del rectángulo principal de la superficie de diseño. Estas áreas pueden administrar los eventos de interfaz de usuario, como los clics del mouse y las operaciones de arrastrar y colocar. La clase Adornment que se define en el espacio de nombres Reporting ServicesMicrosoft.ReportDesigner es una implementación de paso a través de la clase Adorner en Windows Forms. Para obtener la documentación completa de la clase Adorner, vea Información general del servicio de comportamiento en MSDN Library. Para obtener el código muestra que implementa una clase Microsoft.ReportDesigner.Design.Adornment, vea Muestras de productos de SQL Server Reporting Services.

Para obtener más información acerca de cómo programar y usar Windows Forms en Visual Studio, vea estos temas en MSDN Library:

  • Atributos de tiempo de diseño para componentes

  • Componentes de Visual Studio

  • Tutorial: Crear un control de Windows Forms que aproveche las características de tiempo de diseño de Visual Studio