Share via


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

업데이트: 2007년 11월

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

ASP.NET 버전 2.0에서는 새로운 데이터 소스 모델을 통해 페이징, 정렬, 삭제 등의 일반적인 데이터 작업을 데이터 바인딩된 컨트롤 외부로 옮기면서 데이터 바인딩된 컨트롤을 소스 컨트롤에 바인딩할 수 있습니다. 페이지 개발자는 이 모델로 데이터 바인딩된 컨트롤을 보다 유연하게 사용할 수 있고 재사용도를 높일 수 있습니다.

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

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

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

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

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

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

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

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

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

DataBoundControl 클래스나 CompositeDataBoundControl 클래스 등의 데이터 바인딩된 컨트롤 기본 클래스 중 하나에서 파생하면 사용자 지정 데이터 바인딩된 컨트롤에서 다음을 비롯한 다양한 기본 제공 기능을 자동으로 상속합니다.

  • 데이터의 명명된 뷰, 데이터 저장소에서 지원되는 작업 유형을 쿼리하는 기능 및 요청 시 데이터 로드 기능을 제공하는 IDataSource 인터페이스 및 관련 DataSourceView 클래스에 대한 데이터 소스 지원

  • 제네릭 IEnumerable 또는 IListSource 인터페이스에 대한 데이터 소스 지원

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

  • 데이터 바인딩 논리를 다시 게시될 때마다 호출하지 않고 페이지 수명 주기 동안 최대한 늦게 필요할 때만 호출하는 자동 데이터 바인딩 지원. 페이지에서 첫 번째 데이터 바인딩 요청을 수행한 후 이후 요청에서는 뷰 상태에서 데이터를 검색합니다. 따라서 요청 시마다 데이터 소스에 다시 연결할 필요가 없으므로 성능이 향상됩니다.

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

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

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

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

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

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

단계

단계 요약

데이터 바인딩된 컨트롤 기본 클래스 선택

필요한 기능 중 다수를 이미 제공하는 기존 데이터 바인딩된 컨트롤 클래스를 확장하거나 기본 데이터 바인딩된 컨트롤 클래스 중 하나에서 파생합니다.

데이터 바인딩 속성 노출

사용자 지정 컨트롤을 구성하여 기본 데이터 바인딩된 컨트롤 클래스에서 노출하는 최소한으로 필요한 데이터 바인딩 속성에 덧붙여 추가 데이터 바인딩 속성을 노출합니다.

데이터 검색 시작

  • 다음을 수행하여 페이지 개발자가 컨트롤에 할당한 데이터를 검색합니다.

  • 기본 데이터 바인딩된 컨트롤 클래스의 PerformSelect 메서드를 재정의합니다.

  • 기본 데이터 바인딩된 컨트롤 클래스의 GetData 메서드를 호출하여 컨트롤의 데이터 소스 뷰를 검색합니다.

  • DataSourceView 개체의 Select 메서드를 호출하여 데이터 검색을 시작하고 데이터를 받을 콜백 메서드를 지정합니다.

검색된 데이터 처리

Select 메서드의 매개 변수로 지정한 콜백 메서드를 제공합니다. 이 콜백 메서드에는 데이터를 받을 IEnumerable 형식의 매개 변수 하나가 있어야 합니다. 컨트롤에 필요한 모든 데이터 처리는 이 콜백 메서드 내에서 수행되어야 합니다.

데이터를 나타내는 UI 개체 만들기

PerformDataBinding 메서드를 재정의합니다. 이 메서드 내에서 다음 작업을 수행해야 합니다.

  • PerformDataBinding 메서드를 호출하여 이 메서드에 의존하는 다른 코드를 모두 실행합니다.

  • 데이터 컬렉션을 열거하고 데이터를 UI 표시로 나타내는 자식 컨트롤을 만듭니다.

데이터 바인딩된 컨트롤 기본 클래스 선택

컨트롤 개발자는 사용 가능한 데이터 바인딩된 컨트롤 기본 클래스 중 하나를 확장하여 사용자 지정 데이터 바인딩된 컨트롤을 만들 수 있습니다. 다음 표에서는 ASP.NET 2.0에서 사용할 수 있는 데이터 바인딩 기본 클래스를 보여 줍니다. 각 클래스에 대한 설명을 검토하여 사용자 지정 데이터 바인딩된 컨트롤의 요구 사항에 가장 잘 맞는 기본 클래스를 확인해 보십시오. 데이터 바인딩된 컨트롤의 각 기본 클래스 및 구현 예제에 대한 자세한 내용은 각 클래스에 대한 참조 문서를 참조하십시오. ASP.NET에서 제공되는 데이터 바인딩된 컨트롤에 대한 자세한 내용은 ASP.NET 데이터 바인딩 웹 서버 컨트롤 개요를 참조하십시오.

클래스

설명

BaseDataBoundControl

  • 모든 데이터 바인딩된 컨트롤의 기본 클래스이며, 데이터 바인딩을 수행하고 바인딩된 모든 데이터의 유효성을 검사합니다.

DataBoundControl

표준 데이터 바인딩된 컨트롤을 빌드하기 위한 기본 데이터 바인딩 클래스입니다. DataBoundControl에서는 다음과 같은 작업을 수행합니다.

  • 모든 데이터 바인딩된 컨트롤에서 공유하는 기본 구현을 제공합니다.

  • 데이터 소스 컨트롤 및 데이터 컨테이너와 통신하는 논리를 포함합니다.

  • TreeViewListControl 등의 데이터 바인딩된 컨트롤에 대한 기준 역할을 합니다.

ListControl

  • 목록 컨트롤의 기본 클래스이며 DataBoundControl 클래스를 확장합니다. 이 클래스는 Items 컬렉션 및 고급 레이아웃 렌더링 기능을 제공합니다.

CompositeDataBoundControl

  • DataBoundControl 클래스를 확장하는 기본 클래스이며, 다음과 같은 기능을 제공합니다.

  • 다시 게시된 후 뷰 상태에서 컨트롤의 자식 컨트롤 계층 구조를 복원하는 코드를 비롯하여 합성 컨트롤에 필요한 일반적인 코드를 구현합니다.

  • IEnumerable 데이터 소스에 바인딩되고, 컨트롤 트리를 만들 데이터를 열거합니다.

  • GridViewDetailsView 등의 데이터 바인딩된 컨트롤에 대한 기준 역할을 합니다.

HierarchicalDataBoundControl

  • 데이터를 계층 구조 형태로 표시하는 컨트롤의 기본 클래스입니다. TreeViewMenu 등의 데이터 바인딩 트리 기반 컨트롤에 대한 기준 역할을 합니다.

데이터 바인딩 속성 제공

기본 데이터 바인딩된 컨트롤 클래스에서는 페이지 개발자가 데이터 소스를 컨트롤에 바인딩하는 데 필요한 노출된 데이터 바인딩 속성을 이미 제공합니다. 따라서 컨트롤 작성자는 작업을 추가로 수행할 필요가 없습니다. 예를 들어 DataBoundControl에서 파생된 사용자 지정 컨트롤에서는 DataSourceID, DataSourceDataMember라는 노출된 데이터 바인딩 속성 세 개를 상속합니다. 이때 페이지 개발자는 DataSource 또는 DataSourceID 속성의 값을 설정하여 컨트롤을 바인딩할 데이터 소스를 지정할 수 있습니다.

페이지 개발자는 DataSourceID 속성을 통해 데이터 바인딩된 컨트롤에서 데이터를 검색할 데이터 소스를 나타내는 컨트롤 ID를 지정할 수 있습니다.

페이지 개발자는 DataSource 속성을 통해 데이터 바인딩 속성을 다음 두 가지 형식의 데이터 개체에 직접 바인딩할 수 있습니다.

  • Array, ArrayList 또는 Hashtable 개체 등 IEnumerable 인터페이스를 구현하는 개체

  • DataSet 개체 등 IListSource 인터페이스를 구현하는 개체

  • 페이지 개발자는 DataMember 속성 등의 추가 데이터 바인딩 속성을 통해 데이터 컬렉션에서 컨트롤을 바인딩할 부분을 지정할 수 있습니다.

  • 각 데이터 바인딩된 컨트롤 클래스나 데이터 바인딩 기본 클래스에서 제공하는 노출된 데이터 바인딩 속성에 대한 자세한 내용은 각 클래스에 대한 참조 문서를 참조하십시오.

사용자 지정 데이터 바인딩 속성 노출

사용자 지정 컨트롤에 있는 사용자 지정 데이터 바인딩 속성을 노출하거나 기존 데이터 바인딩 속성을 재정의할 때는 컨트롤이 이미 초기화된 경우 OnDataPropertyChanged 메서드를 호출해야 합니다. 이를 통해 데이터 바인딩된 컨트롤이 데이터에 다시 바인딩되므로 컨트롤에서 새로운 데이터 바인딩 속성 설정을 사용할 수 있습니다.

다음 코드 예제에서는 파생된 데이터 바인딩된 컨트롤 클래스에 속하는 속성을 보여 줍니다. 이 예제에서는 데이터 바인딩된 컨트롤이 초기화된 후 데이터 소스를 식별하는 속성이 변경된 경우 데이터 바인딩된 컨트롤에서 OnDataPropertyChanged 메서드를 호출하는 방법을 보여 줍니다.

Inherits DataBoundControl

Public Property DataTextField() As String
    Get
        Dim o As Object = ViewState("DataTextField")
        If o Is Nothing Then
            Return String.Empty
        Else
            Return CStr(o)
        End If
    End Get
    Set(ByVal value As String)
        ViewState("DataTextField") = value
        If (Initialized) Then
            OnDataPropertyChanged()
        End If
    End Set
End Property
public class SimpleDataBoundColumn : DataBoundControl
{
    public string DataTextField
    {
        get
        {
            object o = ViewState["DataTextField"];
            return ((o == null) ? string.Empty : (string)o);
        }
        set
        {
            ViewState["DataTextField"] = value;
            if (Initialized)
            {
                OnDataPropertyChanged();
            }
        }
    }

데이터 검색 시작

데이터 검색은 컨트롤의 기본 데이터 바인딩된 컨트롤에서 상속된 PerformSelect 메서드 재정의 내에서 시작됩니다. 이 메서드 내에서 데이터를 검색하고 반환된 데이터를 처리할 콜백 메서드를 지정합니다.

데이터를 검색하려면 재정의된 PerformSelect 메서드에서 다음과 같은 작업을 수행합니다.

  1. 페이지 개발자가 DataSource 속성이나 DataSourceID 속성을 사용하여 컨트롤에 바인딩할 데이터를 설정했는지 여부를 확인합니다. 이렇게 하려면 IsBoundUsingDataSourceID 속성을 확인합니다. 예를 들어 IsBoundUsingDataSourceID 속성이 false로 설정되어 있으면 DataSource 속성을 사용하여 데이터 소스를 지정한 것입니다.

  2. 페이지 개발자가 DataSource 속성을 설정한 경우 OnDataBinding 메서드를 호출하는 추가 단계가 필요합니다.

  3. GetData 메서드를 호출하여 데이터 바인딩된 컨트롤에 연결된 DataSourceView 개체를 검색합니다.

  4. 검색된 DataSourceViewSelect 메서드를 호출하여 데이터 검색을 시작하고 검색된 데이터를 처리할 콜백 메서드를 지정합니다. Select 메서드는 비동기적으로 작동하므로 데이터를 검색하는 동안 다른 작업을 처리할 수 있습니다.

  5. RequiresDataBinding 속성을 false로 설정한 다음 MarkAsDataBound 메서드를 호출하여 PerformSelect 작업 완료를 나타냅니다.

  6. OnDataBound 이벤트를 발생시킵니다.

다음 코드 예제에서는 PerformSelect 메서드 재정의 내에서 위와 같은 데이터 검색 작업을 완료하는 방법을 보여 줍니다.

Protected Overrides Sub PerformSelect()
    ' Call OnDataBinding here if bound to a data source using the
    ' DataSource property (instead of a DataSourceID), because the
    ' databinding statement is evaluated before the call to GetData.       
    If Not IsBoundUsingDataSourceID Then
        OnDataBinding(EventArgs.Empty)
    End If

    ' The GetData method retrieves the DataSourceView object from  
    ' the IDataSource associated with the data-bound control.            
    GetData().Select(CreateDataSourceSelectArguments(), _
        AddressOf OnDataSourceViewSelectCallback)

    ' The PerformDataBinding method has completed.
    RequiresDataBinding = False
    MarkAsDataBound()

    ' Raise the DataBound event.
    OnDataBound(EventArgs.Empty)

End Sub
protected override void PerformSelect()
{
    // Call OnDataBinding here if bound to a data source using the
    // DataSource property (instead of a DataSourceID), because the
    // databinding statement is evaluated before the call to GetData.       
    if (!IsBoundUsingDataSourceID)
    {
        this.OnDataBinding(EventArgs.Empty);
    }

    // The GetData method retrieves the DataSourceView object from  
    // the IDataSource associated with the data-bound control.            
    GetData().Select(CreateDataSourceSelectArguments(),
        this.OnDataSourceViewSelectCallback);

    // The PerformDataBinding method has completed.
    RequiresDataBinding = false;
    MarkAsDataBound();

    // Raise the DataBound event.
    OnDataBound(EventArgs.Empty);
}

검색된 데이터 처리

검색된 데이터를 받을 콜백 메서드를 직접 만듭니다. 이는 PerformSelect 메서드 재정의 내에서 Select 메서드를 호출할 때 지정한 콜백 메서드입니다. 이 콜백 메서드에는 IEnumerable 형식의 매개 변수 하나만 포함되어야 합니다. 콜백 메서드에서 반환된 데이터를 컨트롤의 필요에 따라 처리할 수 있습니다. 마지막 단계로 PerformDataBinding 메서드를 호출합니다.

다음 코드 예제에서는 IEnumerable 형식 매개 변수가 있고 PerformDataBinding 메서드를 호출하는 콜백 메서드를 보여 줍니다.

Private Sub OnDataSourceViewSelectCallback(ByVal retrievedData As IEnumerable)
    ' Call OnDataBinding only if it has not already been 
    ' called in the PerformSelect method.
    If IsBoundUsingDataSourceID Then
        OnDataBinding(EventArgs.Empty)
    End If
    ' The PerformDataBinding method binds the data in the  
    ' retrievedData collection to elements of the data-bound control.
    PerformDataBinding(retrievedData)

End Sub
private void OnDataSourceViewSelectCallback(IEnumerable retrievedData)
{
    // Call OnDataBinding only if it has not already been 
    // called in the PerformSelect method.
    if (IsBoundUsingDataSourceID)
    {
        OnDataBinding(EventArgs.Empty);
    }
    // The PerformDataBinding method binds the data in the  
    // retrievedData collection to elements of the data-bound control.
    PerformDataBinding(retrievedData);
}

데이터를 나타내는 UI 개체 만들기

PerformDataBinding 메서드 재정의 내에서 데이터를 나타내는 자식 컨트롤을 만듭니다. 데이터 컬렉션이 열거되고 자식 컨트롤이 작성되며 각 데이터 항목에 따라 해당 속성이 설정됩니다. 컨트롤의 Controls 컬렉션에 자식 컨트롤을 새로 추가하면 자식 컨트롤이 자동으로 렌더링됩니다. 컨트롤의 상속된 Render 메서드가 실행되는 동안 컨트롤 계층 구조가 렌더링됩니다. Render 메서드를 재정의하여 추가 HTML 요소를 포함하거나 디자인 모드에서 특수 렌더링을 표시하는 등 사용자 지정 컨트롤에 필요한 특수 렌더링을 수행할 수도 있습니다.

데이터를 나타내는 UI 개체를 만들려면 PerformDataBinding 메서드를 재정의하고 다음과 같은 작업을 수행합니다.

  1. PerformDataBinding 메서드를 호출하여 이 메서드에 의존하는 다른 코드를 모두 실행합니다.

  2. 데이터 컬렉션을 열거하고 데이터를 UI 표시로 나타내는 자식 컨트롤을 만듭니다. 컨트롤의 Add 메서드를 호출하여 컨트롤의 컬렉션에 각 자식 컨트롤을 추가합니다.

  • 다음 코드 예제에서는 PerformDataBinding 메서드를 재정의하는 방법을 보여 줍니다. 이 예제에서는 PerformDataBinding 메서드를 호출하여 이 메서드에 의존하는 다른 코드를 모두 실행합니다. 또한 데이터 컬렉션을 열거하고 데이터를 UI 표시로 나타내는 자식 컨트롤을 만듭니다.
        Protected Overrides Sub PerformDataBinding(ByVal retrievedData As IEnumerable)
            MyBase.PerformDataBinding(retrievedData)

            ' Verify data exists.
            If Not (retrievedData Is Nothing) Then
                Dim tbl As New Table()
                Dim row As TableRow
                Dim cell As TableCell
                Dim dataStr As String = String.Empty

                Dim dataItem As Object
                For Each dataItem In retrievedData
                    ' If the DataTextField was specified get the data
                    ' from that field, otherwise get the data from the first field. 
                    If DataTextField.Length > 0 Then
                        dataStr = DataBinder.GetPropertyValue(dataItem, DataTextField, Nothing)
                    Else
                        Dim props As PropertyDescriptorCollection = TypeDescriptor.GetProperties(dataItem)
                        If props.Count >= 1 Then
                            If Nothing <> props(0).GetValue(dataItem) Then
                                dataStr = props(0).GetValue(dataItem).ToString()
                            End If
                        End If
                    End If

                    row = New TableRow()
                    tbl.Rows.Add(row)
                    cell = New TableCell()
                    cell.Text = dataStr
                    row.Cells.Add(cell)
                Next dataItem

                Controls.Add(tbl)
            End If

        End Sub
    End Class
End Namespace
protected override void PerformDataBinding(IEnumerable retrievedData)
{
    base.PerformDataBinding(retrievedData);

    // Verify data exists.
    if (retrievedData != null)
    {
        Table tbl = new Table();
        TableRow row;
        TableCell cell;
        string dataStr = String.Empty;

        foreach (object dataItem in retrievedData)
        {
            // If the DataTextField was specified get the data
            // from that field, otherwise get the data from the first field. 
            if (DataTextField.Length > 0)
            {
                dataStr = DataBinder.GetPropertyValue(dataItem,
                    DataTextField, null);
            }
            else
            {
                PropertyDescriptorCollection props =
                        TypeDescriptor.GetProperties(dataItem);
                if (props.Count >= 1)
                {
                    if (null != props[0].GetValue(dataItem))
                    {
                        dataStr = props[0].GetValue(dataItem).ToString();
                    }
                }
            }

            row = new TableRow();
            tbl.Rows.Add(row);
            cell = new TableCell();
            cell.Text = dataStr;
            row.Cells.Add(cell);
        }

        this.Controls.Add(tbl); 
    }
}

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

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

참고 항목

작업

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

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

개념

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

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

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

참조

HierarchicalDataBoundControlDesigner

기타 리소스

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