Share via


Criando um componente de tempo de design de item de relatório personalizado

Um componente em tempo de design de item de relatório personalizado é um controle que pode ser usado no ambiente do Designer de Relatórios do Visual Studio. O componente em tempo de design de item de relatório personalizado oferece uma superfície de design ativada que pode aceitar operações de arrastar e soltar, a integração ao pesquisador de propriedade do Visual Studio e a capacidade de oferecer editores de propriedade personalizados.

Com um componente em tempo de design de item de relatório personalizado, o usuário pode posicionar um item de relatório personalizado em um relatório no ambiente de design, definir propriedades de dados personalizadas no item de relatório personalizado e, depois, salvar esse item como parte do projeto de relatório.

As propriedades definidas usando o componente de tempo de design no ambiente de desenvolvimento são serializadas e desserializadas pelo ambiente de design do host. As propriedades são armazenadas como elementos no arquivo RDL (Report Definition Language). Quando o processador de relatório executa o relatório, as propriedades definidas usando o componente de tempo de design são passadas pelo processador de relatório para um componente de tempo de execução de item de relatório personalizado, que renderiza o item de relatório personalizado e o passa de volta para o processador de relatório.

Observação

O componente item de relatório personalizado em tempo de design é implementado como um componente do Microsoft .NET Framework. Este documento descreverá detalhes de implementação específicos do componente em tempo de design de item de relatório personalizado.

Para obter uma amostra de um item de relatório personalizado totalmente implementado, consulte Amostras de produto do SQL Server Reporting Services.

Implementar um componente de tempo de design

A classe principal de um componente de item de relatório personalizado em tempo de design é herdada da classe Microsoft.ReportDesigner.CustomReportItemDesigner. Além dos atributos padrão usados para um controle .NET Framework, a classe de componente deve definir um atributo CustomReportItem. Esse atributo deve corresponder ao nome do item de relatório personalizado conforme definido no arquivo reportserver.config. Para obter uma lista de atributos .NET Framework, confira Atributos na documentação do SDK .NET Framework.

O seguinte exemplo de código mostra atributos que estão sendo aplicados a um controle em tempo de design de item de relatório personalizado:

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

Inicializar o componente

Você passa propriedades especificadas pelo usuário para um item de relatório personalizado usando uma classe CustomData. A implementação da classe CustomReportItemDesigner deve substituir o método InitializeNewComponent para criar uma nova instância da classe CustomData do componente e defini-la com valores padrão.

O seguinte exemplo de código mostra um exemplo de uma classe de componente de item de relatório personalizado em tempo de design que substitui o método CustomReportItemDesigner.InitializeNewComponent para inicializar a classe CustomData do 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 propriedades do componente

Você pode modificar as propriedades CustomData no ambiente de design de diversas maneiras. Você pode modificar quaisquer propriedades expostas pelo componente em tempo de design que estejam marcadas com o atributo BrowsableAttribute usando o pesquisador de propriedade do Visual Studio. Além disso, você pode modificar as propriedades arrastando itens para a superfície de design do item de relatório personalizado ou clicando com o botão direito do mouse no controle do ambiente de design e selecionando Propriedades no menu de atalho para exibir uma janela de propriedades personalizadas.

O seguinte exemplo de código mostra uma propriedade Microsoft.ReportDesigner.CustomReportItemDesigner.CustomData que tem o atributo BrowsableAttribute aplicado:

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

Você pode fornecer ao componente em tempo de design uma caixa de diálogo de editor de propriedades personalizadas. A implementação do editor de propriedades personalizadas deve ser herdada da classe ComponentEditor e deve criar uma instância de uma caixa de diálogo a ser usada na edição de propriedades.

O seguinte exemplo mostra uma implementação de uma classe herdada de ComponentEditor e exibe uma caixa de diálogo de editor de propriedade personalizadas:

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

Sua caixa de diálogo de editor de propriedades personalizadas pode invocar o Editor de Expressão do Designer de Relatórios. Neste exemplo, o Editor de Expressão é invocado quando o usuário seleciona o primeiro elemento na caixa de combinação:

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

Usar verbos de designer

Um verbo do designer é um comando de menu vinculado a um manipulador de eventos. Você pode adicionar verbos de designer que aparecem no menu de atalho de um componente quando o controle de tempo de execução do item de relatório personalizado está sendo usado no ambiente de design. Você pode retornar a lista de verbos do designer disponíveis do componente em tempo de execução usando a propriedade Verbs.

O exemplo de código a seguir mostra um verbo DesignerVerbCollectionde designer e um manipulador de eventos sendo adicionados ao . O exemplo também mostra o código do manipulador 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();  
}  

Use adornos

As classes de item de relatório personalizado também podem implementar uma classe Microsoft.ReportDesigner.Design.Adornment. Um adorno permite que o controle de item de relatório personalizado forneça áreas fora do retângulo principal da superfície de design. Essas áreas podem tratar eventos de interface do usuário, tais como cliques de mouse e operações de arrastar e soltar. A classe Adornment definida no namespace Microsoft.ReportDesigner do Reporting Services é uma implementação de passagem da classe Adorner encontrada no Windows Forms. Para obter a documentação completa da classe Adorner, consulte Visão geral do serviço de comportamento na biblioteca MSDN. Para obter um código de exemplo que implementa uma classe Microsoft.ReportDesigner.Design.Adornment, consulte Amostras de produto do SQL Server Reporting Services.

Para obter mais informações sobre programação e uso do Windows Forms no Visual Studio, consulte estes artigos na Biblioteca MSDN:

  • Atributos em tempo de design para componentes

  • Componentes em Visual Studio

  • Passo a passo: Criando um controle do Windows Forms que aproveita recursos em tempo de design do Visual Studio

Arquitetura de item de relatório personalizada
Criando um componente de tempo de execução de item de relatório personalizado
Bibliotecas de classes de item de relatório personalizadas
Como implantar um item de relatório personalizado