웁스... 역시 이 세상은 입에 풀칠하는 것도 버거운 세상임을 새삼 느낀다. 어쨌든 좀 늦어진 감이 있지만 우리의 최종 목표인 Vote 클래스를 구현해 보자.
(VoteItemCollection 클래스는
상당히 복잡하여 여러 가지 상황을 감안한 끝에 걍 ArrayList 정도로 대체하기로 했다..ㅡ,.ㅡ)
일단 다음과 같이 Vote클래스를 선언해보자.
|
||||||
VoteControl 클래스 구현하기 1 | ||||||
웁스... 역시 이 세상은 입에 풀칠하는 것도 버거운 세상임을 새삼 느낀다. 어쨌든 좀 늦어진 감이 있지만 우리의 최종 목표인 Vote 클래스를 구현해 보자.
(VoteItemCollection 클래스는 상당히 복잡하여 여러 가지 상황을 감안한 끝에 걍 ArrayList 정도로 대체하기로 했다..ㅡ,.ㅡ) 일단 다음과 같이 Vote클래스를 선언해보자.
1 using System;
2 using System.Collections; 3 using System.ComponentModel; 4 using System.ComponentModel.Design; 5 using System.Data; 6 using System.Web; 7 using System.Web.UI; 8 using System.Web.UI.Design; 9 using System.Web.UI.HtmlControls; 10 using System.Web.UI.WebControls; 11 using System.Xml; 12 namespace WebGenie.Vote { 13 [ 14 ParseChildren(true, ""), 15 DesignerAttribute(typeof(VoteDesigner), typeof(IDesigner)), 16 ToolboxData("<{0}:Vote runat=server></{0}:Vote>) 17 ] 18 public class VoteControl : WebControl, INamingContainer { 19 }//End of class VoteControl 20 }//End of namespace
나머지 코드는 속성이나 메소드 별로 차례차례 살펴보기로 하고 일단 클래스의 선언 부터 살펴보도록 하자.
20줄의 짧은 코드에 참 많은 것이 담겨있다. 먼저 using 절을 이용한 네임스페이스 참조에서 4번, 8번 라인을 주목하자. System.Design.dll 어셈블리의 참조를 통해 ComponentModel과 Web.UI 네임 스페이스의 하위 네임 스페이스인 Design 네임 스페이스에 대한 참조가 가능해졌다. 이 네임 스페이스는 VoteControl 클래스가 VS.NET 웹 폼 디자이너를 지원하기 위한 클래스 및 인터페이스에 대한 참조를 가능하게 해 준다.
다음으로 13번 라인부터 17번 라인까지 이어지는 3개의 클래스 특성 정보를 살펴보자. 처음 만나는 ParseChildren 특성은 서버 컨트롤 태그를 작성할 때 서버 컨트롤 태그 내의 중첩된 태그를 클래스의 속성으로 처리할 지 또는 자식 컨트롤로 처리 할 지를 결정한다. 이 특성 값이 true이면 중첩된 태그들이 클래스의 속성으로 처리되며 false이면 중첩된 태그들을 하위 클래스로 인식한다.
<asp:Repeater ID="repeater1" Runat="server">
<ItemTemplate> ItemTemplate 내용 </ItemTemplate> </asp:Repeater>
예제 코드에서 <ItemTemplate> 태그는 <asp:Repeater> 태그의 중첩된 태그이다. ParseChildren 특성이 true이면
<ItemTemplate> 태그가 <asp:Repeater>의 속성이 되며 false이면 자식 클래스가 된다는 뜻이다.
ParseChildren 특성의 두 번째 인자는 기본 속성을 지정하는 것인데 여기에는 클래스의 기본 속성으로 사용할 속성 명을 string 타입으로 지정해 줄 수 있다. 예제에서는 기본 속성을 사용하지 않기 위해 빈 문자열을 대입했다.
두 번째 특성은 DesignerAttribute 특성이다. 이 특성이 바로 Designer 클래스와 컨트롤 클래스를 서로 묶어 주는 역할을 하는 특성이다.
우리가 지난 시간에 구현했던 VoteDesigner 클래스를 기억하고 있는가? VoteDesigner 클래스는 VoteControl 클래스가 VS.NET의 웹 폼 디자이너를 통해 위지윅으로 보여질 수 있도록 지원하는 클래스이다. 이 클래스의 타입을 15번 라인과 같이 typeof 연산자를 이용하여 DesignerAttribute 특성의 첫번째 인자로 전달함으로써 VoteControl 클래스의 디자이너 클래스를 VoteDesigner 클래스로 지정할 수 있다. 두번째 인자는 디자이너의 기본 타입으로 IDesginer 인터페이스의 타입을 대입하기 위해 역시 typeof 연산자를 사용한다.
마지막 특성은 ToolboxData 특성인데 이는 2번째 강좌에서 초간단 웹 폼 컨트롤 구현하기 절에서 설명하였으므로 2번째 강좌의 내용을 참고하기 바란다.
이제 18번 라인의 클래스 선언을 살펴보도록 하자. 우리가 구현할 온라인 투표 컨트롤이 웹 폼 컨트롤이므로 WebControl 클래스를 상속하는 것은 당연한데 뒤에 못보던 녀석이 또 하나 있다. INamingContainer라는 이 인터페이스의 상속은 웹 폼 컨트롤을 구현할 때 상당히 중요한데 이 인터페이스는 컨트롤의 계층 구조내에 컨트롤을 구별하기 위한 임의의 새로운 네임스페이스를 만들어준다. 무슨 말인고 하니... 우리가 구현할 컨트롤은 버튼을 클릭하여 사용자가 선택한 아이템을 서버로 전송해야 한다. 이 때 VoteControl 클래스 내부에 프로그래밍적으로 버튼 컨트롤이 추가되는데 이 컨트롤을 내부적으로 관리하기 위해 별도의 네임스페이스가 필요하게 되고 이것을 만들어 주는 것이 INamingContainer 네임 스페이스다. 만일 이 네임 스페이스에 대한 상속을 생략한다면 버튼의 클릭 이벤트가 제대로 동작하지 않을 것이다. 또한 이 인터페이스는 상속하는 클래스에게 어떠한 추가적인 메소드 구현을 강요하지 않으므로 단지 상속하는 것만으로 내부의 클래스 게층을 관리하는 기능을 얻을 수 있게 된다. |
||||||
VoteControl 클래스 구현하기 2 | ||||||
이제 본격적으로 VoteControl 클래스를 구현해 보자. 먼저 몇 개의 멤버 변수와 그에 해당하는 속성이 필요하다.
예제의 단순화를 위해 비교적 꼭 필요한 멤버 변수만을 선언해 보겠다. 클래스에 다음과 같은 멤버 변수들을 추가하자.
1 private bool _isDesignMode = false;
2 private bool _allowMultiSelect = false; 3 private string _xmlPath = string.Empty; 4 private string _resultPageUrl = string.Empty; 5 private Button _voteBtn = new Button(); 6 private Button _resultBtn = new Button();
멤버 변수에 대해 간단히 설명하면 각각 다음과 같다.
이들 멤버 변수들은 모두 private 멤버이므로 이들의 값을 변경하기 위해 public 속성들을 구현해 주어야 한다.
다음과 같이 속성들을 구현해 보자. 이 중 _isDesignMode 멤버 변수는 내부적으로만 참조할 것이므로 굳이 속성을 구현할 필요는 없으며, 속성을 구현하는 코드는 이미 여러분에게 익숙한 코드일 것이므로 설명은 생략하도록 하겠다.
1 public bool AllowMultiSelect {
2 get {return _allowMultiSelect;} 3 set {_allowMultiSelect = value;} 4 } 5 public string XmlPath { 6 get {return _xmlPath;} 7 set {_xmlPath = value;} 8 } 9 public string ResultPageUrl { 10 get {return _resultPageUrl;} 11 set {_resultPageUrl = value;} 12 }
이제 필요한 메소드들을 구현하면 VoteControl 클래스를 완성할 수 있게 되었다. 그러나 필요한 메소드들이 꽤 많을 뿐더러
코드가 길기도 상당히 길다.
다음 강좌부터 하나씩 살펴보기로 하자. |
첫댓글 움.. 강좌에 소질을 타고 나셨어요^^*
그러게염..흐흐흐