Поделиться через


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

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

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

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

ПримечаниеПримечание

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

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

Основной класс компонента времени разработки пользовательского элемента отчета наследуется от класса 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
    {
...

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

Определяемые пользователем свойства передаются пользовательскому элементу отчета при помощи класса Microsoft.ReportDesigner.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.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, определенный в пространстве имен служб Reporting ServicesMicrosoft.ReportDesigner, является транзитной реализацией класса Adorner, используемого в формах Windows Forms. Полные сведения о классе Adorner см. в разделе Общие сведения о службе поведения библиотеки MSDN. Образец кода, реализующего класс Microsoft.ReportDesigner.Design.Adornment, см. в разделе Образцы продуктов служб SQL Server Reporting Services.

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

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

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

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