Создание компонента пользовательского элемента отчета во время разработки

Компонент времени разработки пользовательского элемента отчета ― это элемент управления, который может быть использован в конструкторе отчетов среды Visual Studio. Компонент времени разработки пользовательского элемента отчета предоставляет активную область конструктора, поддерживающую операции перетаскивания, интеграцию с браузером свойств среды Visual Studio и возможность использования пользовательских редакторов свойств.

Благодаря компоненту времени разработки пользователь может расположить пользовательский элемент отчета в отчете в среде конструктора, задать пользовательские свойства данных в элементе отчета и сохранить элемент отчета в виде части проекта отчета.

Свойства, заданные с помощью компонента времени разработки в среде разработки, сериализуются и десериализируются средой разработки узла. Затем свойства хранятся в виде элементов в файле языка определения отчетов (RDL). Когда обработчик отчетов выполняет отчет, свойства, заданные с помощью компонента времени разработки, передаются обработчиком отчетов в компонент времени выполнения пользовательского элемента отчета, который отрисовывает пользовательский элемент отчета и передает его обратно обработчику отчетов.

Примечание.

Компонент времени разработки для пользовательского элемента отчета реализуется в виде компонента Microsoft .NET Framework. В этом документе приводится описание реализации, характерной для компонента времени разработки пользовательского элемента отчета.

Образец полностью реализованного пользовательского элемента отчета см. на странице Образцы продуктов служб SQL Server Reporting Services.

Реализация компонента времени разработки

Основной класс компонента времени разработки для пользовательского элемента отчета наследуется от класса Microsoft.ReportDesigner.CustomReportItemDesigner. Помимо стандартных атрибутов, используемых для элемента управления .NET Framework, класс компонента также должен определять атрибут CustomReportItem. Этот атрибут должен соответствовать имени пользовательского элемента отчета, определенному в файле reportserver.config. Список атрибутов .NET Framework см. в разделе "Атрибуты" в документации по SDK для платформы .NET Framework.

В следующем образце кода приводятся атрибуты, которые используются компонентом времени разработки пользовательского элемента отчета:

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

Инициализация компонента

Определяемые пользователем свойства передаются пользовательскому элементу отчета при помощи класса CustomData. Реализация класса CustomReportItemDesigner должна переопределять метод InitializeNewComponent, который создает экземпляр класса CustomData компонента и присваивает ему значения по умолчанию.

В следующем образце кода показан класс компонента времени разработки для пользовательского элемента отчета, переопределяющий метод CustomReportItemDesigner.InitializeNewComponent, который инициализирует класс 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", ""));  
        }  

Изменение свойств компонента

Свойства CustomData в среде разработки можно изменить несколькими способами. Любые свойства, предоставляемые компонентом времени разработки и отмеченные атрибутом BrowsableAttribute, можно изменить с помощью браузера свойств среды Visual Studio. Кроме того, свойства можно изменить, перетащив элементы в область конструктора пользовательского элемента отчета или щелкнув правой кнопкой мыши элемент управления в среде разработки и выбрав в контекстном меню пункт Свойства для отображения окна с пользовательскими свойствами.

В следующем примере кода показано свойство Microsoft.ReportDesigner.CustomReportItemDesigner.CustomData с примененным атрибутом BrowsableAttribute:

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

Компонент времени разработки можно снабдить диалоговым окном для редактирования пользовательских свойств. Реализация редактора пользовательских свойств должна наследовать класс ComponentEditor и создать экземпляр диалогового окна, который можно использовать для изменения свойств.

В следующем образце кода показана реализация класса, наследующего ComponentEditor и отображающего диалоговое окно редактора пользовательских свойств:

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

Диалоговое окно редактора пользовательских свойств может вызывать редактор выражений конструктора отчетов. В следующем примере редактор выражений вызывается при выборе пользователем первого элемента в поле со списком:

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

Использование команд конструктора

Команда конструктора ― это команда меню, связанная с обработчиком событий. Команды конструктора, отображаемые в контекстном меню компонента, можно добавить при использовании пользовательского элемента управления временем выполнения элемента отчета в среде разработки. Список доступных команд конструктора возвращается из компонента времени выполнения с помощью свойства Verbs.

В следующем примере кода показана команда конструктора и обработчик событий, добавляемый в объект DesignerVerbCollection. В примере также показан код обработчика событий:

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

Использование украшений

Классы пользовательского элемента отчета также могут реализовывать класс Microsoft.ReportDesigner.Design.Adornment. Крайний элемент позволяет элементу управления пользовательского элемента отчета иметь области за пределами основного прямоугольника области конструктора. Эти области могут обрабатывать события пользовательского интерфейса, такие как щелчки кнопкой мыши и операции перетаскивания. Класс Adornment, определенный в пространстве имен Microsoft.ReportDesigner служб Reporting Services, является транзитной реализацией класса Adorner, используемого в Windows Forms. Полные сведения о классе Adorner см. в разделе Общие сведения о службе расширения функциональности библиотеки MSDN. Образец кода, реализующего класс Microsoft.ReportDesigner.Design.Adornment, см. в разделе Образцы продуктов служб SQL Server Reporting Services.

Дополнительные сведения о программировании и использовании Windows Forms в Visual Studio см. в следующих статьях в библиотека MSDN:

  • Атрибуты времени разработки для компонентов

  • Компоненты в Visual Studio

  • Пошаговое руководство. Создание элемента управления Windows Forms, использующего функции времени разработки среды Visual Studio