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

Visual Studio 2010

이 연습에서는 사용자 지정 ASP.NET 웹 서버 컨트롤을 만들고 테스트하는 방법을 보여 줍니다.

이 연습을 통해 다음과 같은 작업 방법을 배웁니다.

  • ASP.NET 웹 서버 컨트롤 만들기

  • 컨트롤에 메타데이터를 추가하여 보안 설정 및 디자인 타임 동작 지정

  • 구성 파일 및 컨트롤의 어셈블리에 태그 접두사 지정

  • Visual Studio 도구 상자에서 컨트롤에 사용할 아이콘 지정

  • 컨트롤을 어셈블리로 컴파일하고, 동일한 솔루션의 다른 프로젝트에서 사용할 수 있도록 프로젝트 참조 추가

  • 웹 페이지에서 컨트롤을 테스트하고, 속성 창 또는 IntelliSense를 사용하여 컨트롤 속성에 액세스

이 항목에 수반되는 소스 코드가 포함된 Visual Studio 솔루션을 다운로드하십시오.

표준 Label 컨트롤에서 파생된 간단한 컨트롤을 만들어 봅니다. 이 컨트롤의 이름은 WelcomeLabel로 지정합니다. 이 컨트롤은 Text 속성에 정의된 텍스트 문자열에 사용자 이름을 추가합니다. 예를 들어 페이지 개발자가 Text 속성 값을 "Hello"로 설정하면 WelcomeLabel 컨트롤에는 "Hello, userName!"이 렌더링됩니다.

이 컨트롤에서는 사용자가 로그인하지 않았을 때 사용할 사용자 이름 값을 지정하는 DefaultUserName 속성을 정의합니다. 예를 들어 페이지 개발자가 Text 속성을 "Hello"로 설정하고 DefaultUserName 속성을 "Guest"로 설정하면 사용자가 로그인하지 않은 경우 이 컨트롤에는"Hello Guest!"가 표시됩니다.

사용자 지정 서버 컨트롤을 만들려면

  1. 파일 메뉴에서 새 프로젝트를 선택합니다.

    새 프로젝트 대화 상자가 표시됩니다.

  2. 설치된 템플릿에서 Visual Basic 또는 Visual C#을 확장하고 을 선택합니다.

  3. ASP.NET 서버 컨트롤 템플릿을 선택합니다.

  4. 이름 상자에 ServerControl1을 입력합니다.

    다음 그림과 유사한 새 프로젝트 대화 상자가 나타납니다.

    새 프로젝트 대화 상자
  5. 확인을 클릭합니다.

    ServerControl1.cs 또는 ServerControl1.vb라는 클래스 파일이 포함된 서버 컨트롤 프로젝트가 만들어집니다.

  6. 서버 탐색기에서 ServerControl1.cs 또는 ServerControl1.vb의 이름을 WelcomeLabel.cs 또는 WelcomeLabel.vb로 바꿉니다.

    다음 그림과 같이 모든 참조 이름을 ServerControl1로 바꿀지 묻는 대화 상자가 표시됩니다.

    파일 이름 바꾸기 및 참조 업데이트
  7. 를 클릭합니다.

  8. WelcomeLabel.cs 또는 WelcomeLabel.vb를 엽니다.

  9. System.Web.UI.WebControls.WebControl 대신 System.Web.UI.WebControls.Label에서 상속하도록 WelcomeLabel 클래스를 변경합니다.

  10. WelcomeLabel 클래스의 ToolboxData 특성에서 두 군데 나타나는 문자열 "ServerControl1"을 모두 "WelcomeLabel"로 변경합니다.

  11. WelcomeLabel 클래스에 있는 코드를 삭제하고 다음 예제와 같이 DefaultUserName 속성과 RenderContents 메서드를 삽입합니다.

    
    ' WelcomeLabel.vb
    Option Strict On
    Imports System
    Imports System.ComponentModel
    Imports System.Security.Permissions
    Imports System.Web
    Imports System.Web.UI
    Imports System.Web.UI.WebControls
    
    Namespace Samples.AspNet.VB.Controls
        < _
        AspNetHostingPermission(SecurityAction.Demand, _
            Level:=AspNetHostingPermissionLevel.Minimal), _
        AspNetHostingPermission(SecurityAction.InheritanceDemand, _
            Level:=AspNetHostingPermissionLevel.Minimal), _
        DefaultProperty("Text"), _
        ToolboxData( _
            "<{0}:WelcomeLabel runat=""server""> </{0}:WelcomeLabel>") _
        > _
        Public Class WelcomeLabel
            Inherits WebControl
            < _
            Bindable(True), _
            Category("Appearance"), _
            DefaultValue(""), _
            Description("The welcome message text."), _
            Localizable(True) _
            > _
            Public Overridable Property Text() As String
                Get
                    Dim s As String = CStr(ViewState("Text"))
                    If s Is Nothing Then s = String.Empty
                    Return s
                End Get
                Set(ByVal value As String)
                    ViewState("Text") = value
                End Set
            End Property
    
            Protected Overrides Sub RenderContents( _
                ByVal writer As HtmlTextWriter)
                writer.WriteEncodedText(Text)
                If Context IsNot Nothing Then
                    Dim s As String = Context.User.Identity.Name
                    If (s IsNot Nothing) AndAlso (s <> String.Empty) Then
                        Dim split() As String = s.Split("\".ToCharArray)
                        Dim n As Integer = split.Length - 1
                        If (split(n) <> String.Empty) Then
                            writer.Write(", ")
                            writer.Write(split(n))
                        End If
                    End If
                End If
                writer.Write("!")
            End Sub
        End Class
    End Namespace
    
    
    
    
    // WelcomeLabel.cs
    using System;
    using System.ComponentModel;
    using System.Security.Permissions;
    using System.Web;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    
    namespace Samples.AspNet.CS.Controls
    {
        [
        AspNetHostingPermission(SecurityAction.Demand,
            Level = AspNetHostingPermissionLevel.Minimal),
        AspNetHostingPermission(SecurityAction.InheritanceDemand, 
            Level=AspNetHostingPermissionLevel.Minimal),
        DefaultProperty("Text"),
        ToolboxData("<{0}:WelcomeLabel runat=\"server\"> </{0}:WelcomeLabel>")
        ]
        public class WelcomeLabel : WebControl
        {
            [
            Bindable(true),
            Category("Appearance"),
            DefaultValue(""),
            Description("The welcome message text."),
            Localizable(true)
            ]
            public virtual string Text
            {
                get
                {
                    string s = (string)ViewState["Text"];
                    return (s == null) ? String.Empty : s;
                }
                set
                {
                    ViewState["Text"] = value;
                }
            }
    
            protected override void RenderContents(HtmlTextWriter writer)
            {
                writer.WriteEncodedText(Text);
                if (Context != null)
                {
                    string s = Context.User.Identity.Name;
                    if (s != null && s != String.Empty)
                    {
                        string[] split = s.Split('\\');
                        int n = split.Length - 1;
                        if (split[n] != String.Empty)
                        {
                            writer.Write(", ");
                            writer.Write(split[n]);
                        }
                    }
                }
                writer.Write("!");
            }
        }
    }
    
    
    
    
    using System.Drawing;
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Linq;
    using System.Text;
    using System.Web;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    
    namespace ServerControl1
    {
        [DefaultProperty("Text")]
        [ToolboxData("<{0}:WelcomeLabel runat=server></{0}:WelcomeLabel>")]
        public class WelcomeLabel : Label
        {
            [
            Bindable(true),
            Category("Appearance"),
            DefaultValue(""),
            Description("The text to display when the user is not logged in."),
            Localizable(true)
            ]
            public virtual string DefaultUserName
            {
                get
                {
                    string s = (string)ViewState["DefaultUserName"];
                    return (s == null) ? String.Empty : s;
                }
                set
                {
                    ViewState["DefaultUserName"] = value;
                }
            }
    
            protected override void RenderContents(HtmlTextWriter writer)
            {
                writer.WriteEncodedText(Text);
    
                string displayUserName = DefaultUserName;
                if (Context != null)
                {
                    string userName = Context.User.Identity.Name;
                    if (!String.IsNullOrEmpty(userName))
                    {
                        displayUserName = userName;
                    }
                }
    
                if (!String.IsNullOrEmpty(displayUserName))
                {
                    writer.Write(", ");
                    writer.WriteEncodedText(displayUserName);
                }
    
                writer.Write("!");
            }
        }
    }
    
    
    
  12. 솔루션 탐색기에서 속성 또는 My Project를 확장하고 AssemblyInfo.cs 또는 AssemblyInfo.vb를 엽니다.

  13. 파일의 시작 부분에 다음 줄을 추가합니다.

    Using System.Web.UI;
    

    Imports System.Web.UI
    

    이 네임스페이스는 다음 단계에서 추가할 TagPrefixAttribute 특성에 필요합니다.

  14. 파일의 끝에 다음 줄을 추가합니다.

    [assembly: TagPrefix("ServerControl1", "aspSample")]
    

    <Assembly: TagPrefix("ServerControl1", "aspSample")> 
    

    TagPrefixAttribute 특성은 ServerControl1 네임스페이스와 aspSample 접두사 간의 매핑을 만듭니다.

  15. WelcomeLabel.cs 또는 WelcomeLabel.vb 파일을 저장합니다.

코드 설명

다음 단원에서는 이전 절차에서 만든 코드에 대해 설명합니다.

WebControl 클래스에서 상속

컨트롤이 UI(사용자 인터페이스) 요소나 클라이언트의 보이는 다른 요소를 렌더링하는 경우 System.Web.UI.WebControls.WebControl이나 이 클래스의 파생 클래스에서 컨트롤을 파생시켜야 합니다. 이 예제의 사용자 지정 컨트롤은 Label에서 파생되며 이 클래스는 System.Web.UI.WebControls.WebControl에서 파생됩니다. 컨트롤이 클라이언트 브라우저에서 보이지 않는 요소(예: 숨겨진 요소 또는 meta 요소)를 렌더링할 경우에는 System.Web.UI.Control에서 컨트롤을 파생시킵니다. WebControl 클래스는 Control에서 파생되고 Font, ForeColorBackColor 같은 스타일 관련 속성을 추가합니다. 또한 WebControl에서 파생되는 컨트롤은 별도의 추가 작업 없이도 ASP.NET의 테마 기능에 참여합니다.

DefaultUserName 속성

WelcomeLabel 컨트롤은 DefaultUserName이라는 하나의 속성을 정의하고, 다시 게시할 때마다 뷰 상태를 사용하여 이 속성 값을 유지합니다. 다시 게시할 때마다 페이지가 다시 만들어지고 뷰 상태에서 값이 복원됩니다. DefaultUserName 속성 값이 뷰 상태에 저장되지 않은 경우에는 다시 게시할 때마다 속성 값이 기본값 Empty로 설정됩니다. WebControl 에서 상속된 ViewState 속성은 데이터 값을 저장하는 사전입니다. String 키를 사용하여 값을 입력하고 검색합니다. 이 경우 "DefaultUserName"은 키로 사용됩니다. 사전의 항목은 Object로 형식화되며, 나중에 이 항목에 액세스할 때 형식을 실제 속성 형식으로 캐스팅해야 합니다. 뷰 상태에 대한 자세한 내용은 ASP.NET 상태 관리 개요를 참조하십시오.

RenderContents 메서드

WelcomeLabel 컨트롤은 상속된 RenderContents 메서드를 재정의하여 응답 스트림에 텍스트를 씁니다. RenderContents 메서드에 전달된 매개 변수는 HtmlTextWriter 형식의 개체이며 이 개체는 HTML을 렌더링하는 메서드가 포함된 클래스입니다.

WelcomeLabel 컨트롤은 문자열 연결을 수행한 다음 Write 메서드를 호출하는 대신 HtmlTextWriter 개체의 Write 메서드를 연속해서 호출합니다. 이렇게 하면 HtmlTextWriter 개체가 출력 스트림에 직접 기록하므로 성능이 향상됩니다. 문자열을 연결하려면 문자열을 만드는 데 시간과 메모리가 필요하고 그 다음에 스트림에 기록됩니다.

일반적으로 컨트롤이 WebControl에서 파생되고 단일 요소를 렌더링하는 경우 Render 메서드가 아니라 RenderContents 메서드를 재정의해야 합니다. WebControl Render 메서드는 컨트롤의 여는 태그와 스타일 특성을 렌더링한 후 RenderContents를 호출합니다. Render 메서드를 재정의하여 내용을 작성하면 WebControlRender 메서드에 기본으로 제공된 스타일 렌더링 논리가 컨트롤에서 없어집니다. WebControl 에서 파생되는 컨트롤을 렌더링하는 데 대한 자세한 내용은 웹 컨트롤 렌더링 예제를 참조하십시오.

컨트롤의 특성입니다.

WelcomeLabel 컨트롤과 DefaultUserName 속성에 적용되는 특성은 공용 언어 런타임과 디자인 타임 도구에서 사용하는 메타데이터를 포함합니다. 클래스 수준에서 WelcomeLabel은 다음과 같은 특성으로 표시되어 있습니다.

  • DefaultPropertyAttribute . 컨트롤의 기본 속성을 지정하는 디자인 타임 특성입니다. 비주얼 디자이너의 속성 브라우저에서는 일반적으로 페이지 개발자가 디자인 화면의 컨트롤을 클릭하면 기본 속성이 강조 표시됩니다.

  • ToolboxDataAttribute . 요소의 형식 문자열을 지정합니다. 이 문자열은 도구 상자의 컨트롤을 두 번 클릭하거나 디자인 화면으로 끌어오면 해당 컨트롤의 태그가 됩니다. WelcomeLabel의 경우 이러한 형식 문자열을 통해 다음 요소가 만들어집니다.

    <aspSample:WelcomeLabel runat="server"> </aspSample:WelcomeLabel>
    

또한 WelcomeLabel 컨트롤은 WebControl 기본 클래스에서 ParseChildrenAttributePersistChildrenAttribute라는 두 개의 특성을 상속 받습니다. 이러한 특성은 ParseChildren(true)PersistChildren(false)으로 적용됩니다. 이 두 특성은 상호 작용하거나 ToolboxDataAttribute 특성과 함께 사용되어 자식 요소가 속성으로 해석되거나 속성이 특성으로 유지되도록 합니다.

DefaultUserName 속성의 특성

WelcomeLabelDefaultUserName 속성에 적용되는 다음 특성은 일반적으로 컨트롤의 모든 공용 속성에 적용하는 디자인 타임 특성입니다.

  • BindableAttribute . 비주얼 디자이너에 대해 속성을 데이터에 바인딩할 수 있는지 여부를 지정합니다. 예를 들어 Visual Studio에서 속성이 Bindable(true)로 표시되어 있으면 이 속성이 DataBindings 대화 상자에 표시됩니다. 속성이 이 특성으로 표시되어 있지 않으면 속성 브라우저에서는 속성 값을 Bindable(false)로 가정합니다.

  • CategoryAttribute . 비주얼 디자이너의 속성 브라우저에서 속성을 분류하는 방법을 지정합니다. 예를 들어 Category("Appearance") 특성을 설정하면 페이지 개발자가 속성 브라우저에서 범주 보기를 사용하는 경우 속성 브라우저에서 모양 범주에 속성이 표시됩니다. 속성 브라우저에서 기존 범주에 해당하는 문자열 인수를 지정하거나 새 범주를 직접 만들 수 있습니다.

  • DescriptionAttribute . 속성에 대한 간단한 설명을 지정합니다. Visual Studio의 속성 브라우저에서는 선택한 속성에 대한 설명이 속성 창 아래쪽에 표시됩니다.

  • DefaultValueAttribute . 속성의 기본값을 지정합니다. 이 값은 속성 접근자(getter)에서 반환하는 기본값과 같아야 합니다. Visual Studio에서 DefaultValueAttribute 특성을 사용하면 페이지 개발자는 속성 창에서 바로 가기 메뉴를 표시한 다음 다시 설정 단추를 클릭하여 속성 값을 기본값으로 다시 설정할 수 있습니다.

  • LocalizableAttribute . 비주얼 디자이너에 대해 속성을 지역화할 수 있는지 여부를 지정합니다. 속성이 Localizable(true)로 표시되면 비주얼 디자이너에서는 속성을 리소스로 serialize할 때 이 속성 값을 포함합니다. 지역화할 수 있는 속성에 대해 컨트롤이 폴링되면 비주얼 디자이너에서는 culture 중립적인 리소스 파일이나 다른 지역화 소스에 이 속성 값을 유지합니다.

컨트롤과 해당 멤버에 적용되는 디자인 타임 특성은 런타임에 컨트롤의 기능 방식에는 영향을 주지 않습니다. 그러나 비주얼 디자이너에서 해당 컨트롤을 사용할 때 개발자 환경을 향상시켜 줍니다. 서버 컨트롤에 대한 디자인 타임 및 런타임 특성의 전체 목록을 보려면 사용자 지정 서버 컨트롤의 메타데이터 특성을 참조하십시오.

태그 접두사

태그 접두사는 컨트롤을 페이지에서 선언적으로 만드는 경우 컨트롤의 형식 이름 앞에 나오는 접두사입니다(예: <asp:Table />의 "asp"). 컨트롤을 페이지에서 선언적으로 사용하려면 컨트롤의 네임스페이스에 태그 접두사를 매핑해야 합니다. 페이지 개발자는 다음 예제와 같이 사용자 지정 컨트롤을 사용하는 각 페이지에 @ Register 지시문을 추가하여 태그 접두사/네임스페이스 매핑을 제공할 수 있습니다.

<%@ Register Assembly="ServerControl" TagPrefix="aspSample" 
        Namespace="ServerControl"%>

Visual Studio에서 도구 상자의 사용자 지정 서버 컨트롤을 .aspx 페이지로 끌어오면 Register 지시문이 자동으로 추가됩니다.

각 .aspx 페이지에서 @ Register 지시문을 사용하는 대신 Web.config 파일에 태그 접두사/네임스페이스 매핑을 지정할 수 있습니다. 이 방법은 사용자 지정 컨트롤이 웹 응용 프로그램의 여러 페이지에 사용될 경우 유용합니다. 다음 예제에서는 ServerControl1 어셈블리의 태그 접두사를 지정하는 Web.config 파일을 보여 줍니다.

<?xml version="1.0"?>
<configuration>
  <system.web>    
   <pages>
     <controls>
       <add tagPrefix="aspSample" Assembly="ServerControl" 
         namespace="ServerControl">
       </add>
     </controls>
   </pages>
  </system.web>
</configuration>

아래 절차에서는 다음 작업을 수행합니다.

  • 앞의 절차에서 만든 서버 컨트롤을 테스트하는 데 사용할 웹 사이트를 만듭니다.

  • 웹 사이트 프로젝트에서 서버 컨트롤 프로젝트에 대한 참조를 추가합니다.

  • WelcomeLabel 컨트롤을 도구 상자에 추가합니다.

  • WelcomeLabel 컨트롤의 인스턴스를 Default.aspx 페이지에 추가합니다.

  • Default.aspx 페이지를 실행하여 WelcomeLabel 컨트롤이 작동하는지 확인합니다.

먼저 테스트에 사용할 수 있는 웹 사이트를 만들어야 합니다.

이 연습에서는 웹 사이트 프로젝트를 사용합니다. 대신 웹 응용 프로그램 프로젝트를 사용할 수도 있습니다. 이러한 웹 프로젝트 형식 간의 차이점에 대한 자세한 내용은 웹 응용 프로그램 프로젝트와 웹 사이트 프로젝트 비교를 참조하십시오.

웹 사이트 프로젝트를 만들어 사용자 지정 서버 컨트롤을 테스트하려면

  1. 파일 메뉴에서 추가를 클릭하고 새 웹 사이트를 선택합니다.

    새 웹 사이트 대화 상자가 표시됩니다.

  2. 설치된 템플릿에서 Visual Basic 또는 C#을 선택하고 ASP.NET 웹 사이트 템플릿을 선택합니다.

  3. 웹 사이트를 TestWebSite라는 이름으로 ServerControl1 솔루션 폴더 아래의 새 폴더에 저장합니다.

    다음 그림과 유사한 새 웹 사이트 대화 상자가 나타납니다.

    새 웹 사이트 대화 상자
  4. 확인을 클릭합니다.

    웹 사이트 프로젝트가 만들어져 ServerControl1 솔루션에 추가되고 소스 뷰에서 Default.aspx 페이지가 열립니다.

  5. 서버 탐색기에서 해당 웹 사이트 프로젝트를 마우스 오른쪽 단추로 클릭하고 시작 프로젝트로 설정을 선택합니다.

  6. 서버 탐색기에서 해당 웹 사이트 프로젝트를 마우스 오른쪽 단추로 클릭하고 참조 추가를 선택합니다.

    참조 추가 대화 상자가 표시됩니다.

  7. 프로젝트 탭을 선택하고 ServerControl1 프로젝트를 선택한 다음 확인을 클릭합니다. 다음 그림과 같은 참조 추가 대화 상자가 표시됩니다.

    참조 추가 대화 상자

다음 단계에서는 서버 컨트롤을 테스트 웹 사이트의 웹 페이지에서 사용할 수 있도록 도구 상자에 추가합니다.

WelcomeLabel 컨트롤을 도구 상자에 추가하려면

  1. 빌드 메뉴에서 솔루션 빌드를 선택합니다.

    솔루션이 컴파일되고 ServerControl1 프로젝트에 의해 만들어진 어셈블리가 TestWebSite 프로젝트의 Bin 폴더에 복사됩니다.

  2. Default.aspx 페이지가 열려 있는 상태에서 도구 상자 창을 엽니다.

  3. 마우스 오른쪽 단추로 도구 상자 창의 아무 곳이나 클릭하고 탭 추가를 클릭합니다.

  4. 새 탭의 이름을 ServerControl1로 지정합니다.

  5. ServerControl1 탭을 마우스 오른쪽 단추로 클릭하고 항목 선택을 클릭합니다.

  6. 찾아보기를 선택하고 TestWebSite 프로젝트의 Bin 폴더로 이동합니다.

  7. ServerControl1.dll을 선택하고 열기를 클릭합니다.

    다음 그림과 같이 도구 상자 항목 선택 대화 상자의 .NET Framework 구성 요소 탭에 ServerControl1 어셈블리가 추가됩니다.

    항목 선택 대화 상자
  8. 확인을 클릭합니다.

    WelcomeLabel 컨트롤이 도구 상자ServerControl1에 나타납니다.

이제 웹 페이지에 서버 컨트롤을 추가하고 웹 페이지를 테스트할 수 있습니다.

WelcomeLabel 컨트롤을 테스트하려면

  1. Default.aspx 페이지에서 "ASP.NET 시작" 텍스트를 지우고 해당 위치로 도구 상자WelcomeLabel 컨트롤을 끌어옵니다.

  2. WelcomeLabel 컨트롤의 태그에 TextDefaultUserName 특성을 추가하고 해당 값을 다음 예제와 같이 "Welcome"으로 설정합니다.

    <aspSample:WelcomeLabel ID="WelcomeLabel1" runat="server" Text="Welcome" DefaultUserName="Guest">
    </aspSample:WelcomeLabel>
    
  3. Ctrl+F5를 눌러 브라우저에서 웹 페이지를 표시합니다.

    다음 그림과 같이 WelcomeLabel 컨트롤에 "Welcome!"이 표시됩니다.

    사용자 이름이 없는 WelcomeLabel 컨트롤
  4. 로그인 하이퍼링크를 클릭합니다.

    로그인 페이지가 표시됩니다.

  5. 등록 하이퍼링크를 클릭합니다.

    다음 그림과 같이 새 계정 만들기 페이지가 표시됩니다.

    새 계정 만들기 페이지
  6. 사용자 이름과 전자 메일 주소에 각각 newuser와 newuser@asp.net을 입력하고 암호를 입력한 다음 사용자 만들기 단추를 클릭합니다.

    ASP.NET에서 새 사용자 계정이 만들어지고 새 사용자로 로그인된 다음 홈 페이지가 다시 표시됩니다. 이제 다음 그림과 같이 WelcomeLabel 컨트롤에 "Welcome, newuser!"가 표시됩니다.

    사용자 이름이 있는 WelcomeLabel 컨트롤

Visual Studio에서는 일반적으로 다음 그림과 같이 기본 아이콘을 사용하여 도구 상자에 컨트롤을 표시합니다.

도구 상자의 기본 서버 컨트롤 아이콘

옵션으로 컨트롤의 어셈블리에 16x16 픽셀 비트맵을 포함하여 도구 상자에서 컨트롤의 모양을 사용자 지정할 수 있습니다.

도구 상자용 아이콘을 지정하려면

  1. 16x16 픽셀 비트맵을 컨트롤에 대한 도구 상자 아이콘으로 가져오거나 새로 만듭니다.

  2. 비트맵 이름을 WelcomeLabel.bmp로 지정합니다.

  3. 솔루션 탐색기에서 ServerControl1 프로젝트를 마우스 오른쪽 단추로 클릭하고 기존 항목 추가를 선택한 다음 비트맵 파일을 선택합니다.

  4. 속성 창에서 비트맵 파일의 빌드 작업 속성을 포함 리소스로 변경합니다.

  5. 솔루션 탐색기에서 ServerControl1 프로젝트를 마우스 오른쪽 단추로 클릭하고 새 항목 추가를 선택합니다.

    새 항목 추가 대화 상자가 표시됩니다.

  6. 클래스 템플릿을 선택하고 파일 이름을 ResourceFinder.cs 또는 ResourceFinder.vb로 지정한 다음 추가를 클릭합니다.

    ResourceFinder.cs 또는 Resourcefinder.vb 파일이 열립니다.

  7. 다음 예제와 같이 ResourceFinder 클래스가 sealedinternal(Visual Basic의 경우 FriendNotInheritable)인지 확인합니다.

    
    Friend NotInheritable Class ResourceFinder
    
    End Class
    
    
    
    
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    namespace ServerControl1
    {
        internal sealed class ResourceFinder
        {
        }
    }
    
    
    
    
    <%@ Page Language="C#"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml" >
      <head id="Head1" runat="server">
        <title>WelcomeLabel Test</title>
      </head>
      <body>
        <form id="form1" runat="server">
          <div>
            <aspSample:WelcomeLabel Text="Hello" ID="WelcomeLabel1" 
              runat="server" BackColor="Wheat" ForeColor="SaddleBrown" />
          </div>
        </form>
      </body>
    </html>
    
    
    
  8. 파일을 저장한 후 닫습니다.

  9. WelcomeLabel.cs 또는 WelcomeLabel.vb 파일을 열고 파일의 처음 부분에 다음 줄을 추가합니다.

    Using System.Drawing;
    

    이 네임스페이스는 다음 단계에서 추가할 ToolboxBitmapAttribute 특성에 필요합니다.

  10. WelcomeLabel 클래스에서 다음 예제와 같이 ToolboxBitmapAttribute 특성을 추가하고 ServerControl1 네임스페이스 접두사를 포함한 WelcomeLabel.bmp 파일 이름을 지정합니다.

    [DefaultProperty("Text")]
    [ToolboxData("<{0}:WelcomeLabel runat=server></{0}:WelcomeLabel>")]
    [ToolboxBitmap(typeof(ResourceFinder), "ServerControl1.WelcomeLabel.bmp")]
    public class WelcomeLabel : Label
    
  11. 파일을 저장한 후 닫습니다.

  12. 빌드 메뉴에서 솔루션 빌드를 선택합니다.

  13. TestWebSite 프로젝트에서 Default.aspx 파일을 엽니다.

  14. 도구 상자에서 WelcomeLabel 컨트롤을 마우스 오른쪽 단추로 클릭하고 삭제를 선택합니다.

  15. ServerControl1 탭을 마우스 오른쪽 단추로 클릭하고 항목 선택을 클릭합니다.

  16. 찾아보기를 선택하고 TestWebSite 프로젝트의 Bin 폴더로 이동합니다.

  17. ServerControl1.dll을 선택하고 열기를 클릭합니다.

    도구 상자 항목 선택 대화 상자의 .NET Framework 구성 요소 탭에 ServerControl1 어셈블리가 추가됩니다.

  18. 항목 선택 대화 상자에서 확인을 클릭합니다.

    WelcomeLabel 컨트롤이 도구 상자ServerControl1에 다시 나타납니다. 선택한 아이콘은 다음 그림과 같이 WelcomeLabel 이름의 왼쪽에 나타납니다.

    도구 상자의 사용자 지정 서버 컨트롤 아이콘

이 연습에서는 간단한 사용자 지정 ASP.NET 서버 컨트롤을 개발하고 페이지에서 이 컨트롤을 사용하는 방법을 확인했습니다. 렌더링, 속성 정의, 상태 관리, 여러 브라우저 또는 장치 유형 처리, 복합 컨트롤 구현 등에 대한 자세한 내용은 사용자 지정 ASP.NET 서버 컨트롤 개발을 참조하십시오.

GridView 같은 복합 컨트롤은 디자인 타임과 런타임에 서로 다른 사용자 인터페이스를 제공하는 비주얼 디자이너 클래스를 사용하여 디자인 타임 환경을 향상시킵니다. 컨트롤의 사용자 지정 디자이너 클래스를 구현하는 방법에 대한 자세한 내용은 ASP.NET 컨트롤 디자이너 개요를 참조하십시오.

표시: