Share via


ASP.NET 1.1용 사용자 지정 데이터 바인딩 웹 서버 컨트롤 개발

업데이트: 2007년 11월

ASP.NET 데이터 바인딩 웹 서버 컨트롤에서는 레코드 또는 항목의 컬렉션을 나타내는 데이터 소스의 UI(사용자 인터페이스)를 제공합니다. 데이터 바인딩 웹 서버 컨트롤의 예로는 GridView 웹 서버 컨트롤 개요, DataList 웹 서버 컨트롤 개요Repeater 웹 서버 컨트롤 개요 서버 컨트롤이 있습니다. ASP.NET에서 제공되는 데이터 바인딩된 컨트롤에 대한 자세한 내용은 ASP.NET 데이터 바인딩 웹 서버 컨트롤 개요를 참조하십시오.

이 항목에서는 사용자 지정 ASP.NET 버전 1.1 호환 데이터 바인딩된 서버 컨트롤의 최소 버전을 구현하는 데 필요한 단계를 보여 줍니다. ASP.NET 버전 2.0에서 사용자 지정 데이터 바인딩된 컨트롤을 만드는 방법에 대한 자세한 내용은 ASP.NET 2.0용 사용자 지정 데이터 바인딩 웹 서버 컨트롤 개발을 참조하십시오. 사용자 지정 컨트롤의 일반 아키텍처 및 구현에 대한 자세한 내용은 사용자 지정 ASP.NET 서버 컨트롤 개발연습: 사용자 지정 서버 컨트롤 개발 및 사용을 참조하십시오.

사용자 지정 데이터 바인딩된 컨트롤을 만들어야 하는 경우

사용자 지정 데이터 바인딩된 컨트롤을 직접 만들기 전에 ASP.NET에서 이미 제공되는 데이터 바인딩된 컨트롤의 기능을 검토해 보십시오. 기존 컨트롤이 요구 사항에 맞을 수도 있고, 필요한 기능 중 많은 부분이 들어 있는 기존 컨트롤을 확장하여 사용자 지정 컨트롤을 만들 수도 있습니다. ASP.NET에서 제공되는 데이터 바인딩된 컨트롤에 대한 자세한 내용은 ASP.NET 데이터 바인딩 웹 서버 컨트롤 개요를 참조하십시오.

사용자 지정 데이터 바인딩된 컨트롤을 만들게 되는 이유는 다음과 같습니다.

  • 사용자 지정 UI, 사용자 지정 데이터 정렬 기능 또는 기존 데이터 바인딩된 컨트롤에서 사용할 수 없는 사용자 지정 데이터 편집 기능이 필요한 경우

  • 미리 컴파일되어 재배포 가능한 사용자 지정 데이터 바인딩된 컨트롤을 만들려는 경우

  • ASP.NET에서 이미 제공되는 데이터 바인딩된 컨트롤의 기능을 확장하려는 경우

  • 특정한 요구에 맞는 사용자 지정 디자이너를 사용하여 데이터 바인딩된 컨트롤을 만들려는 경우

사용자 지정 데이터 바인딩된 컨트롤의 기본 기능

Control 또는 WebControl 클래스에서 파생하면 사용자 지정 데이터 바인딩된 컨트롤에 다음을 비롯한 다양한 기본 제공 기능이 자동으로 상속됩니다.

  • 데이터 바인딩 식을 지원하는 명시적인 데이터 바인딩 모델. ASP.NET의 명시적인 데이터 바인딩 모델에서는 데이터 바인딩을 다시 게시할 때마다 수행하지 않고 필요할 때만 수행합니다. 페이지에서 첫 번째 데이터 바인딩 요청을 수행한 후 이후 요청에서는 뷰 상태에서 데이터를 검색하려고 시도합니다. 따라서 요청할 때마다 데이터 소스에 다시 연결할 필요가 없으므로 성능이 향상됩니다.

  • 페이지 개발자가 컨트롤에서 노출되어 특별히 표시된 속성과 데이터 소스 간에 바인딩을 만들 수 있도록 하는 데이터 바인딩 식 지원. 데이터 바인딩 식에 대한 자세한 내용은 데이터 바인딩 식 개요을 참조하십시오.

사용 가능한 디자인 타임 기능 활용

모든 웹 서버 컨트롤에서 사용 가능한 디자인 타임 기능을 사용자 지정 데이터 바인딩된 컨트롤에서 사용할 수도 있습니다. 사용자 지정 컨트롤에 대한 디자이너 클래스 및 컨트롤 템플릿을 만들 수 있습니다. 이러한 기능은 Visual Studio의 디자인 뷰와 같은 시각적 디자인 화면에서 컨트롤 작업을 수행할 때 호출됩니다.

컨트롤 디자이너를 만들면 페이지 개발자가 컨트롤 속성을 사용자 지정할 수 있는 디자인 타임 인터페이스가 제공되므로 디자인 타임에 사용자 지정 컨트롤의 유용성이 크게 향상됩니다. ASP.NET 컨트롤 디자이너에 대한 개요는 ASP.NET 컨트롤 디자이너 개요를 참조하십시오. 예제를 보려면 HierarchicalDataBoundControlDesigner연습: 웹 서버 컨트롤의 기본 컨트롤 디자이너 만들기를 참조하십시오.

템플릿 기반 컨트롤을 만들면 페이지 개발자가 컨트롤의 사용자 인터페이스를 정의하는 컨트롤 및 태그를 지정하도록 할 수 있습니다. 사용자 지정 템플릿 기반 컨트롤의 예제를 보려면 템플릿 기반 서버 컨트롤 예제를 참조하십시오.

ASP.NET에서 사용자 지정 데이터 바인딩된 컨트롤 구현

다음 표에서는 ASP.NET 1.1에서 데이터 바인딩된 서버 컨트롤을 구현하는 데 필요한 요구 사항을 요약하여 보여 줍니다. 표 아래에는 각 구현 요구 사항에 대한 자세한 내용이 나와 있습니다.

요구 사항

설명

DataSource 속성 노출

페이지 개발자가 해당 컨트롤을 사용하여 바인딩할 데이터 소스를 지정할 수 있게 합니다.

DataBind 메서드 재정의 및 관련 데이터 소스의 개체를 열거하는 논리 작성

이 메서드의 논리에서는 다음을 수행합니다.

  • 서버 컨트롤의 OnDataBinding 메서드를 호출하고 DataBind 이벤트를 발생시킵니다. 이를 통해 페이지 개발자가 데이터 바인딩 서버 컨트롤에 연결한 모든 데이터 바인딩 식을 계산할 수 있습니다.

  • 사용자는 데이터 소스의 개체를 열거하는 모든 논리를 여기에 제공해야 합니다.

  • 모든 자식 컨트롤이 만들어져 데이터 소스를 시각적으로 나타냅니다.

CreateChildControls 메서드를 재정의하여 자식 컨트롤 계층 구조 만들기

다시 게시될 때 자식 컨트롤을 다시 만들어 이전에 DataBind를 호출할 때 뷰 상태에 저장된 데이터에 바인딩합니다.

참고:

DataBindCreateChildControls 메서드에서 자식 컨트롤 계층 구조를 만들기 위해 호출되는 도우미 메서드 하나를 만들 수 있습니다. 예를 들어 자식 컨트롤 계층 구조를 만드는 도우미 메서드에 데이터가 바인딩 소스에 있는지 아니면 뷰 상태에 있는지를 나타내는 Boolean 값을 사용할 수 있습니다. 이러한 패턴을 통해 컨트롤의 자식 컨트롤 계층 구조를 만드는 작업을 하나의 공통 코드 경로에 유지할 수 있습니다. 이러한 패턴에 대한 예제는 연습: ASP.NET 1.1용 사용자 지정 데이터 바인딩 ASP.NET 웹 컨트롤 만들기를 참조하십시오.

DataSource 속성 노출

Control 또는 WebControl에서 파생된 ASP.NET 1.1 데이터 바인딩된 컨트롤에서는 페이지 개발자가 서버 컨트롤이 바인딩될 데이터 컬렉션을 선택할 수 있도록 DataSource 속성을 노출해야 합니다. 런타임에 사용자 지정 데이터 바인딩된 컨트롤에서는 DataSource 속성에 할당된 데이터 컬렉션을 열거하여 이러한 데이터를 나타내는 UI 요소를 만들고 바인딩합니다.

데이터 바인딩 서버 컨트롤은 다음과 같은 형식에 바인딩될 수 있습니다.

다음 코드 예제에서는 데이터 바인딩된 컨트롤의 DataSource 속성을 노출하는 방법을 보여 줍니다. DataSource 형식은 IEnumerable 형식으로 선언됩니다.

<Category("Data"), DefaultValue(""), Description("An exposed data source: A public member of type IEnumerable to bind to such as an Array, ArrayList or Hashtable.")> _
Public Overridable Property DataSource() As IEnumerable
    Get
        Return _dataSource
    End Get
    Set(ByVal value As IEnumerable)
        If TypeOf value Is IEnumerable OrElse value Is Nothing Then
            _dataSource = value
        Else
            Throw New ArgumentException()
        End If
    End Set
End Property
[
Category("Data"),
DefaultValue(""),
Description("An exposed data source: A public member of type IEnumerable to bind to such as an Array, ArrayList or Hashtable.")
]
public virtual IEnumerable DataSource
{
    get
    {
        return _dataSource;
    }
    set
    {
        if ((value is IEnumerable) || (value == null))
        {
            _dataSource = value;
        }
        else
        {
            throw new ArgumentException();
        }
    }
}

이 예제는 [Category], [DefaultValue] 및 [Description] 등의 메타데이터 특성으로 시작됩니다. 이러한 특성은 디자인 도구, ASP.NET 페이지 파서, ASP.NET 런타임 및 CLR(공용 언어 런타임)에서 사용되는 정보를 제공합니다. BindableAttribute는 속성 브라우저에서 컨트롤의 바인딩 가능한 속성을 대화 상자에 표시할 수 있음을 비주얼 디자이너에 알립니다. 예를 들어 Visual Studio에서는 바인딩 가능한 속성이 DataBindings 대화 상자에 표시됩니다. CategoryAttribute는 비주얼 디자이너의 속성 브라우저에서 속성이 분류되는 방식을 지정합니다. 이 예제에 사용된 특성 및 메타데이터 특성에 대한 자세한 내용은 사용자 지정 서버 컨트롤의 메타데이터 특성을 참조하십시오.

DataSource 속성의 set 접근자에서는 설정할 값이 null이거나 IEnumerable 형식인지 확인합니다. 따라서 이 예제에서는 페이지 개발자가 데이터를 Array, ArrayList 또는 Hashtable 등의 모든 IEnumerable 형식에 바인딩할 수 있습니다. 또는 IEnumerable 형식의 적합한 데이터 소스를 사용할 수 있을 때까지 DataSource를 null로 설정할 수 있습니다.

참고:

사용자 지정 데이터 바인딩 서버 컨트롤을 IEnumerable 또는 IListSource 데이터 형식에 바인딩할 수 있게 하려면 DataSource 속성을 제네릭 형식인 Object로 선언합니다. 이러한 경우 DataSource를 노출하는 set 접근자에서는 전달되는 개체의 형식을 확인한 다음 IEnumerable 또는 IListSource를 구현해야 합니다.

DataBind 메서드 재정의 및 관련 데이터 소스 열거

사용자 지정 컨트롤에서 기본 DataBind 메서드를 재정의하여 두 가지 작업을 수행해야 합니다. 즉, 바인딩 데이터 컬렉션을 열거하고 이러한 데이터를 나타내는 자식 컨트롤 계층 구조를 만들어야 합니다. 다음 목록에서는 재정의된 DataBind 메서드 내에서 수행해야 하는 작업을 보여 줍니다.

  • 사용자 지정 컨트롤의 기본 OnDataBinding 메서드 호출

  • 기존 자식 컨트롤 지우기

  • 모든 자식 컨트롤 뷰 상태 지우기

  • 데이터 바인딩 도중 발생한 변경 내용이 뷰 상태에 유지되도록 상태 추적

  • 자식 컨트롤 계층 구조 만들기

  • ChildControlsCreated 속성을 true로 설정

우선 컨트롤의 재정의된 DataBind 메서드 내에서 컨트롤의 기본 OnDataBinding 메서드를 호출합니다. 컨트롤의 기본 OnDataBinding 메서드를 호출하면 컨트롤의 모든 데이터 바인딩 식이 계산됩니다. 다음 코드 예제에서는 데이터 바인딩 서버 컨트롤의 재정의된 DataBind 메서드 내에서 첫 번째 작업으로 OnDataBinding 메서드를 호출하는 방법을 보여 줍니다.

public override void DataBind()
{
    base.OnDataBinding(EventArgs.Empty);
}
Public Overrides Sub DataBind()
    MyBase.OnDataBinding(EventArgs.Empty)
End Sub

다음으로 기존 자식 컨트롤을 지웁니다. 다시 게시될 때마다 바인딩되는 데이터에 따라 자식 컨트롤 계층 구조를 다시 만들어야 하므로, 다음 코드 예제와 같이 컨트롤의 상속된 Clear 메서드를 호출하여 기존 자식 컨트롤을 모두 지워야 합니다.

public override void DataBind()
{
    base.OnDataBinding(EventArgs.Empty);
    Controls.Clear();
}
Public Overrides Sub DataBind()
    MyBase.OnDataBinding(EventArgs.Empty)
    Controls.Clear()
End Sub

새로 바인딩된 데이터를 나타내는 새로운 자식 컨트롤이 만들어지므로 기존 자식 컨트롤의 모든 뷰 상태를 삭제해야 합니다. 컨트롤의 상속된 ClearChildViewState 메서드를 호출하면 모든 자식 컨트롤의 뷰 상태가 지워집니다.

모든 기존 자식 컨트롤의 뷰 상태를 지운 후 컨트롤의 상속된 TrackViewState를 호출하여 컨트롤의 뷰 상태 추적을 시작합니다. 이 메서드에서는 뷰 상태를 자동으로 추적해 줍니다. 자식 컨트롤 계층 구조가 만들어지기 전에 컨트롤 상태 추적이 시작되므로 데이터 바인딩 도중 자식 컨트롤 계층 구조에서 발생한 모든 변경 내용이 뷰 상태에 유지됩니다. 페이지의 PreInit 이벤트 도중 페이지 개발자가 DataBind를 호출할 수도 있으므로, 컨트롤의 기본 클래스를 통해 뷰 상태를 추적하면 페이지 수명 주기에서 해당 단계 이후에 발생하는 변경 내용이 추적되지 않을 수 있습니다. 이러한 경우에는 프로세스에서 컨트롤의 뷰 상태 추적이 너무 늦게 수행됩니다.

다음 코드 예제에서는 데이터 바인딩 서버 컨트롤의 TrackViewState 메서드를 호출하는 방법을 보여 줍니다.

public override void DataBind() 
{
    TrackViewState();
}
Public Overrides Sub DataBind()
    TrackViewState()
End Sub

다음으로 자식 컨트롤 계층 구조를 만듭니다. 자식 컨트롤 계층 구조는 사용자 지정 데이터 바인딩된 컨트롤이 바인딩되는 데이터 소스를 시각적으로 나타내며, 사용자 지정 컨트롤의 기본 클래스에 의해 사용자 지정 컨트롤의 재정의된 DataBind 또는 CreateChildControls 메서드가 호출될 때 만들어집니다. 컨트롤의 기본 클래스에 의해 컨트롤의 재정의된 DataBind가 호출되면 바인딩된 데이터 소스를 기반으로 컨트롤의 자식 계층 구조가 만들어집니다. 기본 클래스에 의해 컨트롤의 재정의된 CreateChildControls 메서드가 호출되면 뷰 상태에 저장된 데이터를 기반으로 자식 컨트롤 계층 구조가 만들어집니다.

자식 컨트롤 계층 구조 작성은 컨트롤의 DataBind 메서드 호출 시 트리거됩니다. 컨트롤에서는 노출된 DataSource 속성으로 제공되는 데이터를 열거하고 각 데이터 항목을 나타내는 새 자식 컨트롤을 인스턴스화합니다. 예를 들어 데이터 소스가 Button 컨트롤의 Text 속성에 바인딩되는 문자열 배열인 경우, 배열을 반복하면서 새 Button 컨트롤을 만들고 문자열로 나타낸 반복되는 데이터 항목을 해당 Text 속성에 할당합니다.

자식 컨트롤 계층 구조를 만든 후 ChildControlsCreated 속성을 true로 설정하여 CreateChildControls 메서드는 기본 클래스에서 호출하면 안 된다는 것을 나타냅니다.

다음 코드 예제에서는 데이터 바인딩 서버 컨트롤의 ChildControlsCreated 속성을 true로 설정하는 방법을 보여 줍니다.

public override void DataBind()
{
     ChildControlsCreated = true;
} 
Public Overrides Sub DataBind()
    ChildControlsCreated = True
End Sub

사용자 지정 데이터 바인딩된 컨트롤 클래스에서는 컨트롤에서 자식 컨트롤 계층 구조를 다시 만들고 저장된 뷰 상태를 적용할 수 있도록 CreateChildControls 메서드를 재정의해야 합니다. 저장된 뷰 상태는 컨트롤의 DataBind 메서드를 가장 최근에 호출한 시점을 기준으로 추적됩니다.

다음 목록에서는 재정의된 CreateChildControls 메서드에서 수행해야 하는 작업을 보여 줍니다.

  • 기존 자식 컨트롤 지우기

  • 뷰 상태를 사용할 수 있는 경우 자식 컨트롤 계층 구조 만들기

자식 컨트롤 계층 구조를 다시 만들기 전에 기존 자식 컨트롤 개체를 모두 지워야 합니다. 이렇게 하려면 컨트롤의 Clear 메서드를 호출합니다.

다음 코드 예제에서는 데이터 바인딩 서버 컨트롤의 Clear 메서드를 호출하는 방법을 보여 줍니다.

public override void CreateChildControls()
{
    Controls.Clear();
}

마지막 단계로 자식 컨트롤 계층 구조를 만듭니다. CreateChildControls 메서드에서는 뷰 상태를 사용할 수 있는 경우 자식 컨트롤 계층 구조를 다시 만들어야 합니다. 같은 수와 형식의 자식 컨트롤을 같은 계층 구조로 만드는 경우 저장된 뷰 상태가 자식 컨트롤에 자동으로 적용됩니다. 컨트롤에서는 같은 수와 형식의 자식 컨트롤을 같은 계층 구조로 다시 만드는 데 필요한 정보를 컨트롤의 ViewState 속성에 저장할 수 있습니다. 컨트롤 뷰 상태를 저장하는 데 대한 자세한 내용은 ViewState를 참조하십시오. 사용자 지정 데이터 바인딩된 컨트롤에서 자식 컨트롤 계층 구조를 만드는 방법을 보여 주는 전체 코드 예제를 보려면 연습: ASP.NET 1.1용 사용자 지정 데이터 바인딩 ASP.NET 웹 컨트롤 만들기를 참조하십시오.

사용자 지정 서버 컨트롤 빌드

사용자 지정 데이터 바인딩 웹 서버 컨트롤을 빌드하여 웹 페이지에서 사용하는 방법에 대한 자세한 내용은 사용자 지정 서버 컨트롤 예제 빌드를 참조하십시오.

참고:

System.Design 어셈블리에 대한 참조를 추가하여 이 어셈블리를 컴파일에 포함해야 합니다.

참고 항목

작업

연습: ASP.NET 1.1용 사용자 지정 데이터 바인딩 ASP.NET 웹 컨트롤 만들기

연습: 사용자 지정 서버 컨트롤 개발 및 사용

개념

ASP.NET 데이터 바인딩 웹 서버 컨트롤 개요

사용자 지정 서버 컨트롤의 메타데이터 특성

ASP.NET 컨트롤 디자이너 개요

참조

HierarchicalDataBoundControlDesigner

기타 리소스

사용자 지정 ASP.NET 서버 컨트롤 개발