사용자 지정 보고서 항목 디자인 타임 구성 요소 만들기

사용자 지정 보고서 항목 디자인 타임 구성 요소는 Visual Studio 보고서 디자이너 환경에서 사용할 수 있는 컨트롤입니다. 사용자 지정 보고서 항목 디자인 타임 구성 요소는 끌어서 놓기 작업이 가능하고 Visual Studio 속성 브라우저와 통합되고 사용자 지정 속성 편집기를 제공하는 활성화된 디자인 화면을 제공합니다.

사용자 지정 보고서 항목 디자인 타임 구성 요소를 사용하여 사용자는 디자인 환경에서 보고서에 사용자 지정 보고서 항목을 배치하고, 사용자 지정 보고서 항목에 사용자 지정 데이터 속성을 설정한 다음, 사용자 지정 보고서 항목을 보고서 프로젝트의 일부로 저장할 수 있습니다.

개발 환경에서 디자인 타임 구성 요소를 사용하여 설정되는 속성은 호스트 디자인 환경에 의해 직렬화되고 역직렬화됩니다. 그런 다음 속성은 RDL(보고서 정의 언어) 파일에 요소로 저장됩니다. 보고서 프로세서가 보고서를 실행하면 디자인 타임 구성 요소를 사용하여 설정된 속성이 보고서 프로세서에서 사용자 지정 보고서 항목 런타임 구성 요소로 전달됩니다. 이 구성 요소는 사용자 지정 보고서 항목을 렌더링하고 보고서 프로세서에 다시 전달합니다.

참고 항목

사용자 지정 보고서 항목 디자인 타임 구성 요소는 Microsoft .NET Framework 구성 요소로 구현됩니다. 이 문서에서는 사용자 지정 보고서 항목 디자인 타임 구성 요소와 관련된 구현 세부 정보를 설명합니다.

완전히 구현된 사용자 지정 보고서 항목의 샘플은 SQL Server Reporting Services 제품 샘플을 참조 하세요.

디자인 타임 구성 요소 구현

사용자 지정 보고서 항목 디자인 타임 구성 요소의 기본 클래스는 Microsoft.ReportDesigner.CustomReportItemDesigner 클래스에서 상속됩니다. .NET Framework 컨트롤에 사용된 표준 특성 외에, 구성 요소 클래스에서 CustomReportItem 특성을 정의해야 합니다. 이 특성은 reportserver.config 파일에 정의되어 있는 사용자 지정 보고서 항목의 이름과 일치해야 합니다. .NET Framework 특성 목록은 .NET Framework SDK 설명서의 특성을 참조하세요.

다음 코드 예제에서는 사용자 지정 보고서 항목 디자인 타임 컨트롤에 적용되는 특성을 보여줍니다.

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 속성을 수정할 수 있습니다. Visual Studio 속성 브라우저를 사용하여 BrowsableAttribute 특성으로 표시된, 디자인 타임 구성 요소에서 노출한 속성을 수정할 수 있습니다. 또한 사용자 지정 보고서 항목의 디자인 화면으로 항목을 끌어 오거나, 디자인 환경에서 컨트롤을 마우스 오른쪽 단추로 클릭하고 바로 가기 메뉴에서 속성을 선택하여 사용자 지정 속성 창을 표시하는 방법으로 속성을 수정할 수 있습니다.

다음 코드 예제에서는 특성이 적용된 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;  
   }  
}  
  

디자이너 동사 사용

디자이너 동사는 이벤트 처리기에 연결된 메뉴 명령입니다. 디자인 환경에서 사용자 지정 보고서 항목 런타임 컨트롤을 사용할 때 구성 요소의 바로 가기 메뉴에 표시되는 디자이너 동사를 추가할 수 있습니다. 동사 속성을 사용하여 런타임 구성 요소에서 사용 가능한 디자이너 동사 목록을 반환할 수 있습니다.

다음 코드 예제에서는 디자이너 동사와 이벤트 처리기가 추가되는 것을 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 클래스도 구현할 수 있습니다. 장식을 사용하면 사용자 지정 보고서 항목 컨트롤이 디자인 화면의 기본 사각형 외부 영역을 제공할 수 있습니다. 이 영역은 마우스 클릭 및 끌어서 놓기 작업과 같은 사용자 인터페이스 이벤트를 처리할 수 있습니다. Microsoft.ReportDesigner 네임스페이스에 정의된 Adornment 클래스는 Windows Forms에 있는 Adorner 클래스의 통과 구현입니다. Adorner 클래스에 대한 전체 설명서는 MSDN 라이브러리의 Behavior Service 개요를 참조하세요. Microsoft.ReportDesigner.Design.Adornment 클래스를 구현하는 샘플 코드는 SQL Server Reporting Services 제품 샘플을 참조하세요.

Visual Studio에서 Windows Forms를 프로그래밍하고 사용하는 방법에 대한 자세한 내용은 MSDN 라이브러리의 다음 문서를 참조하세요.

  • 구성 요소의 디자인 타임 특성

  • Visual Studio의 구성 요소

  • 연습: Visual Studio의 디자인 타임 기능을 사용하는 Windows Forms 컨트롤 만들기

사용자 지정 보고서 항목 아키텍처
사용자 지정 보고서 항목 런타임 구성 요소 만들기
사용자 지정 보고서 항목 클래스 라이브러리
방법: 사용자 지정 보고서 항목 배포