사용자 지정 보고서 항목 디자인 타임 구성 요소 만들기Creating a Custom Report Item Design-Time Component

사용자 지정 보고서 항목 디자인 타임 구성 요소는 Visual Studio 보고서 디자이너 환경에서 사용할 수 있는 컨트롤입니다.A custom report item design-time component is a control that can be used in the Visual Studio Report Designer environment. 사용자 지정 보고서 항목 디자인 타임 구성 요소는 끌어서 놓기 작업이 가능하고 Visual StudioVisual Studio 속성 브라우저와 통합되고 사용자 지정 속성 편집기를 제공하는 활성화된 디자인 화면을 제공합니다.The custom report item design-time component provides an activated design surface that can accept drag-and-drop operations, integration with the Visual StudioVisual Studio property browser, and the ability to provide custom property editors.

사용자 지정 보고서 항목 디자인 타임 구성 요소를 사용하여 사용자는 디자인 환경에서 보고서에 사용자 지정 보고서 항목을 배치하고, 사용자 지정 보고서 항목에 사용자 지정 데이터 속성을 설정한 다음, 사용자 지정 보고서 항목을 보고서 프로젝트의 일부로 저장할 수 있습니다.With a custom report item design-time component, the user can position a custom report item on a report in the design environment, set custom data properties on the custom report item, and then save the custom report item as part of the report project.

개발 환경에서 디자인 타임 구성 요소를 사용하여 설정된 속성은 호스트 디자인 환경에 의해 serialize 및 deserialize된 다음 RDL(Report Definition Language) 파일에 요소로 저장됩니다.The properties that are set using the design-time component in the development environment are serialized and deserialized by the host design environment and then stored as elements in the Report Definition Language (RDL) file. 보고서 처리기에 의해 보고서가 실행되면, 디자인 타임 구성 요소를 사용하여 설정된 속성을 보고서 처리기가 사용자 지정 보고서 항목 런타임 구성 요소로 전달하고, 이 런타임 구성 요소는 사용자 지정 보고서 항목을 렌더링한 뒤 다시 보고서 처리기로 전달합니다.When the report is executed by the report processor, the properties that are set using the design-time component are passed by the report processor to a custom report item run-time component, which renders the custom report item and passes it back to the report processor.

참고

사용자 지정 보고서 항목 디자인 타임 구성 요소는 MicrosoftMicrosoft .NET Framework.NET Framework 구성 요소로 구현됩니다.The custom report item design-time component is implemented as a MicrosoftMicrosoft .NET Framework.NET Framework component. 이 문서에서는 사용자 지정 보고서 항목 디자인 타임 구성 요소와 관련된 구현 세부 사항을 설명합니다.This document will describe implementation details specific to the custom report item design-time component. .NET Framework.NET Framework를 사용하여 구성 요소를 개발하는 방법은 MSDN 라이브러리에서 Visual Studio의 구성 요소를 참조하십시오.For more information about developing components using the .NET Framework.NET Framework, see Components in Visual Studio in the MSDN library.

완전히 구현된 사용자 지정 보고서 항목 예는 SQL Server Reporting Services 제품 예제를 참조하세요.For a sample of a fully implemented custom report item, see SQL Server Reporting Services Product Samples.

디자인 타임 구성 요소 구현Implementing a Design-Time Component

사용자 지정 보고서 항목 디자인 타임 구성 요소의 주 클래스는 Microsoft.ReportDesigner.CustomReportItemDesigner 클래스에서 상속됩니다.The main class of a custom report item design-time component is inherited from the Microsoft.ReportDesigner.CustomReportItemDesigner class. .NET Framework.NET Framework 컨트롤에 사용된 표준 특성 외에, 구성 요소 클래스에서 CustomReportItem 특성을 정의해야 합니다.In addition to the standard attributes used for a .NET Framework.NET Framework control, your component class should define a CustomReportItem attribute. 이 특성은 reportserver.config 파일에 정의된 사용자 지정 보고서 항목의 이름과 일치해야 합니다.This attribute must correspond to the name of the custom report item as it is defined in the reportserver.config file. .NET Framework.NET Framework 특성 목록은 .NET Framework.NET Framework SDK 설명서에서 "특성(Attributes)"을 참조하십시오.For a list of .NET Framework.NET Framework attributes, see Attributes in the .NET Framework.NET Framework SDK documentation.

다음 코드 예제는 사용자 지정 보고서 항목 디자인 타임 컨트롤에 적용되는 특성을 보여 줍니다.The following code example shows attributes being applied to a custom report item design-time control:

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

    public class PolygonsDesigner : CustomReportItemDesigner  
    {  
...  

구성 요소 초기화Initializing the Component

CustomData 클래스를 사용하여 사용자 지정 보고서 항목에 대해 사용자가 지정한 속성을 전달합니다.You pass user-specified properties for a custom report item using a CustomData class. CustomReportItemDesigner 클래스 구현에서 InitializeNewComponent 메서드를 무시하고 구성 요소 CustomData 클래스의 새 인스턴스를 만들어 이를 기본값으로 설정해야 합니다.Your implementation of the CustomReportItemDesigner class should override the InitializeNewComponent method to create a new instance of your component's CustomData class and set it to default values.

다음 코드 예제는 CustomReportItemDesigner.InitializeNewComponent 메서드를 무시하고 구성 요소의 CustomData 클래스를 초기화하는 사용자 지정 보고서 항목 디자인 타임 구성 요소 클래스의 예를 보여 줍니다.The following code example shows an example of a custom report item design-time component class overriding the CustomReportItemDesigner.InitializeNewComponent method to initialize the component's CustomData class:

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", ""));  
        }  

구성 요소 속성 수정Modifying Component Properties

디자인 환경에서 여러 가지 방법으로 CustomData 속성을 수정할 수 있습니다.You can modify CustomData properties in the design environment in several ways. Visual StudioVisual Studio 속성 브라우저를 사용하여 BrowsableAttribute 특성으로 표시된, 디자인 타임 구성 요소에서 노출한 속성을 수정할 수 있습니다.You can modify any properties that are exposed by the design-time component that are marked with the BrowsableAttribute attribute by using the Visual StudioVisual Studio property browser. 또한 사용자 지정 보고서 항목의 디자인 화면으로 항목을 끌어 오거나, 디자인 환경에서 컨트롤을 마우스 오른쪽 단추로 클릭하고 바로 가기 메뉴에서 속성을 선택하여 사용자 지정 속성 창을 표시하는 방법으로 속성을 수정할 수 있습니다.In addition, you can modify properties by dragging items onto the custom report item's design surface, or by right-clicking the control in the design environment and selecting Properties on the shortcut menu to display a custom properties window.

다음 코드 예제에 BrowsableAttribute 특성이 있는 Microsoft.ReportDesigner.CustomReportItemDesigner.CustomData 속성이 나와 있습니다.The following code example shows a Microsoft.ReportDesigner.CustomReportItemDesigner.CustomData property that has the BrowsableAttribute attribute applied:

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

디자인 타임 구성 요소를 사용자 지정 속성 편집기 대화 상자로 제공할 수 있습니다.You can provide your design-time component with a custom properties editor dialog box. 사용자 지정 속성 편집기 구현은 ComponentEditor 클래스에서 상속해야 하며, 속성 편집에 사용할 수 있는 대화 상자 인스턴스를 만들어야 합니다.The custom property editor implementation should inherit from the ComponentEditor class, and it should create an instance of a dialog box that can be used for property editing.

다음 예제는 ComponentEditor에서 상속되어 사용자 지정 속성 편집기 대화 상자를 표시하는 클래스의 구현을 보여 줍니다.The following example shows an implementation of a class that inherits from ComponentEditor and displays a custom property editor dialog box:

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

사용자 지정 속성 편집기 대화 상자에서 보고서 디자이너 식 편집기를 호출할 수 있습니다.Your custom property editor dialog box can invoke the Report Designer Expression Editor. 다음 예제에서는 사용자가 콤보 상자에서 첫 번째 요소를 선택하면 식 편집기가 호출됩니다.In the following example, the Expression Editor is invoked when the user selects the first element in the combo box:

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

디자이너 동사 사용Using Designer Verbs

디자이너 동사는 이벤트 처리기에 연결된 메뉴 명령입니다.A designer verb is a menu command linked to an event handler. 사용자 지정 보고서 항목 런타임 컨트롤이 디자인 환경에서 사용될 때 구성 요소의 바로 가기 메뉴에 표시할 디자이너 동사를 추가할 수 있습니다.You can add designer verbs that will appear in a component's shortcut menu when your custom report item run-time control is being used in the design environment. Verbs 속성을 사용하여 런타임 구성 요소에서 사용 가능한 디자이너 동사 목록을 반환할 수 있습니다.You can return the list of available designer verbs from your run-time component by using the Verbs property.

다음 코드 예제는 DesignerVerbCollection에 추가할 디자이너 동사 및 이벤트 처리기와 이벤트 처리기 코드를 보여 줍니다.The following code example shows a designer verb and an event handler being added to the DesignerVerbCollection, as well as the event handler code:

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

도구 영역(adornment) 사용Using Adornments

사용자 지정 보고서 항목 클래스는 Microsoft.ReportDesigner.Design.Adornment 클래스도 구현할 수 있습니다.Custom report item classes can also implement a Microsoft.ReportDesigner.Design.Adornment class. 도구 영역(adornment)을 사용하면 사용자 지정 보고서 항목 컨트롤의 주 사각형 디자인 화면 바깥에 일정 영역이 생깁니다.An adornment allows the custom report item control to provide areas outside the main rectangle of the design surface. 이 영역은 마우스 클릭 및 끌어서 놓기 작업과 같은 사용자 인터페이스 이벤트를 처리할 수 있습니다.These areas can handle user interface events, such as mouse clicks and drag-and-drop operations. Reporting ServicesReporting Services Microsoft.ReportDesigner 네임스페이스에 정의된 Adornment 클래스는 Windows Forms에 있는 Adorner 클래스의 통과 구현입니다.The Adornment class that is defined in the Reporting ServicesReporting Services Microsoft.ReportDesigner namespace is a pass-through implementation of the Adorner class found in Windows Forms. Adorner 클래스에 대한 전체 설명은 MSDN 라이브러리에서 동작 서비스 개요를 참조하십시오.For complete documentation on the Adorner class, see Behavior Service Overview in the MSDN library. Microsoft.ReportDesigner.Design.Adornment 클래스를 구현하는 예제 코드는 SQL Server Reporting Services 제품 예제를 참조하십시오.For sample code that implements a Microsoft.ReportDesigner.Design.Adornment class, see SQL Server Reporting Services Product Samples.

Visual StudioVisual Studio에서 Windows Forms를 프로그래밍하고 사용하는 방법은 MSDN Library에서 다음 항목을 참조하십시오.For more information about programming and using Windows Forms in Visual StudioVisual Studio, see these topics in the MSDN Library:

  • 구성 요소의 디자인 타임 특성Design-Time Attributes for Components

  • Visual StudioVisual Studio의 구성 요소Components in Visual StudioVisual Studio

  • 연습: Visual Studio의 디자인 타임 기능을 사용하는 Windows Forms 컨트롤 만들기Walkthrough: Creating a Windows Forms Control that Takes Advantage of Visual Studio Design-Time Features

관련 항목:See Also

사용자 지정 보고서 항목 아키텍처 Custom Report Item Architecture
사용자 지정 보고서 항목 런타임 구성 요소 만들기 Creating a Custom Report Item Run-Time Component
사용자 지정 보고서 항목 클래스 라이브러리 Custom Report Item Class Libraries
방법: 사용자 지정 보고서 항목 배포How to: Deploy a Custom Report Item