ExTextBox Ver 2.4

현재 주소 복사
트랙백 주소 복사
방실이님의 글 (9/14/2006 4:19:47 PM) Viewing : 3065

CustomTextBox

주석과 히스토리는 아래와 같다.
그리고 3개의 특성(Attribute)가 지정되어 있다.

[소스코드]

    /// <summary>
    /// Custom TextBox Ver 2.4
    /// </summary>
    /// <remarks>Prototype - 네오프레임워크</remarks>
    /// <remarks>05.10.24 - 메소드 프라퍼티 이름 빼고 내용은 다 바꿈. - 방실</remarks>
    /// <remarks>06.05.03 - Framework 2.0 버전으로 변경 - 방실 </remarks>
    /// <remarks>06.05.12 - Mail 추가 - 방실</remarks>
    /// <remarks>06.06.01 - Value 프라퍼티 수정 - 방실</remarks>
    /// <remarks>06.07.11 - htc 파일 임베디드 리소스로 변경 - 방실</remarks>
    /// <remarks>06.07.19 - Preset에 DefaultUse, Jumin 추가, nextControl에 ClientID로 변경 - 방실</remarks>
    /// <remarks>06.08.11 - Text 프라퍼티 재정의(스크립트에서 Preset에 의해 값이 변경되지 않고 넘어 올 경우 이 프라퍼티에서 재 구성 한다.) - 방실</remarks>
    [ToolboxData("<{0}:ExTextBox runat=server ></{0}:ExTextBox>")]
    [Designer(typeof(System.Web.UI.Design.TextControlDesigner))]
    [DefaultProperty("ID")]

이번 버전에서 새로 나온..아주 맘에 드는 부분이다.
파일을 어셈블리에 리소스로 임베디드 하는 내용이다..

아랫 부분은 htc파일을 임베디드 하는 부분인데.

WebResourceAttribute의 첫번째 필수 매개변수는 리소스 파일의 경로이며 두번째 매개변수는 MIME 코드이다.
htc파일의 경우 이 MIME 코드가 뭔지 몰라서 고생했다..

이것을 정성태님이 도와 주셨다..(열심히 서핑해서 찾아 주신것..ㅡ.ㅡ;)
아래는 정성태님 토픽 url

보러가기

[소스코드]

[assembly: WebResource("BIT.Web.CustomControls.Resources.control.htc", "text/x-component")]


이 TextBox에 대해서 간략히 설명 하자면..
Preset이라는 프라퍼티가 있으며 이 프라퍼티에서 설정된 Mask대로 htc파일에서 onBlur() 이벤트에서 작동한다.
이게 가장 큰...기능이다..ㅡ.ㅡ;

추 .. 임베디드 되는 리소스 파일은 꼭 속성에서 임베디드라고 저장해야 한다..
이거 간단한거지만..자꾸 까먹는다는..ㅡ.ㅡ;


그래서 코드를 보게 되면
Preset을 사용하게 되면
htc파일을 로드 하게 된다.



[소스코드]


            if (this.Preset != Preset.None)
            {
                writer.AddAttribute("style", "behavior:url('" + Page.ClientScript.GetWebResourceUrl(this.GetType(), "BIT.Web.CustomControls.Resources.control.htc") + "')");
                writer.AddAttribute("preset", this.Preset.ToString());
            }

많은 초보분들이 착각하는게 있는데..
html에서 Attribute라는 기능에 대해서 착각을 한다..

어트리뷰트는 흠..뭐랄까 일시적인 데이터 저장소라고 해야 할까?
특정 태그에 사용자가 임의대로 어떠한 값을 특정 어트리뷰트를 생성해서 저장 할 수가 있다..
이는 물론 스크립트에서 마음대로 사용 할 수가 있다.

예를 들어 컨트롤에서 MinLength속성 설정을 10으로 변경 하였다면..
렌더링시 해당 텍스트박스 태그에 minLength=10 이라고 렌더링 된다.

이는 아래 코드가 렌더링되기 때문이다.

[소스코드]

            //최소길이보다 큰가?
            if (this.minLength > 0)
            {
                writer.AddAttribute("minLength", this.minLength.ToString());
            }

이렇게 렌더링 되는 코드들은
처음에 언급했듯이
onBlur()이벤트가 발생하면 htc파일에 정의되어 있는 preset 속성의 값에 따라 작동한다.

htc파일은..정말..복잡하다..ㅡ.ㅡ;
알아서 살펴 보도록...머리 아프다..@.@

컨트롤에서 제공되는 프라퍼티들은 주석이 상세히(??) 달려 있으니 설명을 생략 한다.

Text와 Value라는 프라퍼티만 잠깐 언급을 하겠다.

Preset을 사용하게 되면 그 설정에 맞게 텍스트 박스의 입력값이 변경된다.
예를 들면..날짜 포맷의 경우.
사용자가 숫자 8자를 입력하게 되면
htc파일은 이를 yyyy-MM-dd 포맷으로 변경시킨다.
그러나 프로그램은 변경된 값과 사용자가 입력시킨 값을 알아야 한다..
그래서 만든 프라퍼티가 Value이며 쌍으로 Text역시 재정의 했다.

프라퍼티 내용이 조금 복잡해 보인듯 하나...별로 복잡할 것도 없다..
Text와 Value의 형식을 맞춰주는 작없을 하는 것 뿐이다.

그리고 사용자가 실제로 입력한 값은 realValue라는 어트리뷰트로 렌더링 된다.

그리고 별로 설명할 만한 것이 없고 코드가 뻔히 보여서..


구현환경
.NET Framework 2.0
Microsoft Visual Studio.NET 2005
Microsoft Windows XP SP2



마지막 업데이트 : (9/27/2006 4:31:57 PM)

TAG : 없음



Trackback 보기 (0)
댓글 보기 (0)
댓글 쓰기

ExCompareValidator Ver 1.1

현재 주소 복사
트랙백 주소 복사
방실이님의 글 (9/11/2006 12:05:14 PM) Viewing : 1827

ExCompareValidator

이 컨트롤은 정말 심플하게 만들어 보았다.
앞서 컨트롤도 물론 이처럼 할수 있다.
필요한 최소한의 것만 재정의 했기 때문에 너무 심플하다.

주석과 히스토리는 아래와 같다.
그리고 커스텀 컨트롤에 필요한 ToolboxDataAttribute도 지정하였다.

[소스코드]

    /// <summary>
    /// Custom RequiredFieldValidator V1.1
    /// </summary>
    /// <remarks>06.05.03 - ProtoType - 방실</remarks>
    /// <remarks>06.07.25 - SetFocusOnError가 정상적으로 안먹히는 버그 수정 - 방실</remarks>
    [ToolboxData("<{0}:ExCompareValidator runat=\"server\" ErrorMessage=\"달라요 달라!!\"></{0}:ExCompareValidator>")]

ExRequiredFieldValidator 와 동일한 스크립트 메소드를 사용하며
역시 같은 메서드를 재정의 했다..

차이점이라면..
상속받는 클래스가 다르다는거..뿐이다..

BaseValidator에서 BaseCompareValidator가 파생되며
이 클래스에서 CompareValidator가 파생된다.

[소스코드]

    public class ExCompareValidator : CompareValidator

아래 코드는 이전의 컨트롤과 똑같다.

[소스코드]

        public ExCompareValidator()
        {
            this.Text = "*";
            this.SetFocusOnError = true;
        }

        private const string AlertScript = @"
function Page_ClientValidate(validationGroup) 
{
    var i, val;
    var errorFocusControl = null;
    var boxErrorMessage;
    Page_InvalidControlToBeFocused = null;

    if (typeof(Page_Validators) == 'undefined') 
    {
        return true;
    }
    for (i = 0; i < Page_Validators.length; i++) 
    {
        val = Page_Validators[i];
        ValidatorValidate(val, validationGroup, null);
        if (errorFocusControl == null && !val.isvalid)
        {
            errorFocusControl = document.getElementById(val.getAttribute('controltovalidate'));
            boxErrorMessage = val.getAttribute('errormessage');
        }
    }
    ValidatorUpdateIsValid();
    ValidationSummaryOnSubmit(validationGroup);
    Page_BlockSubmit = !Page_IsValid;
    if (errorFocusControl != null)
    {
	    alert(boxErrorMessage);
        if(typeof(val.focusOnError) == 'string' && val.focusOnError == 't')
        {
            errorFocusControl.focus();
        }
    }
    return Page_IsValid;
}
";

        protected override void OnPreRender(EventArgs e)
        {
            base.OnPreRender(e);
            if (base.RenderUplevel && !this.Page.ClientScript.IsClientScriptBlockRegistered("AlertKey"))
            {
                this.Page.ClientScript.RegisterClientScriptBlock(typeof(BaseValidator), "AlertKey", AlertScript, true);
            }
        }


구현환경
.NET Framework 2.0
Microsoft Visual Studio.NET 2005
Microsoft Windows XP SP2



마지막 업데이트 : (9/11/2006 12:05:26 PM)

TAG : 없음



Trackback 보기 (0)
댓글 보기 (0)
댓글 쓰기

ExRequiredFieldValidator Ver 1.1

현재 주소 복사
트랙백 주소 복사
방실이님의 글 (9/11/2006 11:38:15 AM) Viewing : 2015

ExRequiredFieldValidator

컨트롤을 제작할때는 여러가지 지침이 있다.
예를 들면 이런 케이스가 있다.
1. 복잡하고 기능이 많은 제공되는 컨트롤이 있는데 나는 이런 기능을 쓰지 않는다..
그래서 나는 이런 복잡한 기능을 제거하고 간편한 기능만 넣는 아주 가벼운 새로운 컨트롤을 작성하겠다..
2. 이 컨트롤은 제공되는게 뭔가 부족하다, 내가 원하는 기능을 추가하되...이 컨트롤 본연의 기능을 그대로 다 하도록 만들겠다.
3. 내가 원하는 기능의 컨트롤은 없다..새로 만들어 봐야 하겠다.


대략 이런 3가지 케이스가 있겠다.
내가 만들어 놓은 컨트롤은 모두 2번에 해당된다..
그래서 가능한 원본 컨트롤의 기능을 모두 계승하고자 노력했다.


주석과 히스토리는 아래와 같다.
그리고 커스텀 컨트롤에 필요한 ToolboxDataAttribute도 지정하였다.

[소스코드]

    /// <summary>
    /// Custom RequiredFieldValidator V1.1
    /// </summary>
    /// <remarks>06.05.03 - ProtoType - 방실</remarks>
    /// <remarks>06.07.25 - SetFocusOnError가 정상적으로 안먹히는 버그 수정 - 방실</remarks>
    [ToolboxData("<{0}:ExRequiredFieldValidator runat=\"server\" ErrorMessage=\"필수 입력 사항입니다.\"></{0}:ExRequiredFieldValidator>")]

모든 유효성 검사 컨트롤은 BaseValidator클래스를 상속 받는다.
이 클래스는 추상클래스로서
EvaluateIsValid()라는 추상 메서드를 하나 가지고 있다.

다들 알겠지만 추상메서드는 반드시 구현하여야 한다.

[소스코드]

public class ExRequiredFieldValidator : BaseValidator

생성자는 아래와 같다.
경험상 SetFocusOnError 프라퍼티는 항상 true로 사용한다.
왜냐하면 alert으로 알려 주기에..어느 컨트롤인지 사용자에게 보여주어야 하기 때문이다..

[소스코드]

        public ExRequiredFieldValidator()
        {
            this.Text = "*";
            this.SetFocusOnError = true;
        }


아래 코드는 핵심 코드이다..
아래 스크립트 메서드는
FCL에 정의되어 있는 TextBox 컨트롤에 임베디드되어 있는 WebUIValidation.js파일의 메서드이다.

이 파일에 대해서 잠깐 언급을 해보자면..
이전 버전의 프레임워크에서는 이 파일이 기본적으로 "C:\Inetpub\wwwroot\aspnet_client\system_web\1_1_4322" 라는 폴더에 생성되었었다.

이 파일을 이런 식으로 사용하는 이유는 ...
src로 포함된 js파일과 페이지에 코딩된 스크립트에 같은 이름의 메서드가 발견되었을때에는 100% 페이지에 코딩된 메서드가 실행된다.
마치 override 처럼 말이다...
이 컨트롤의 재정의는 바로 이 방법을 이용한것이다..ㅡ.ㅡ;

그러나 이번 버전에서 js파일의 리소스화가 가능해졌기 때문에 System.Web.dll에 임베디드 되었다.
물론 Reflector로 상세히 볼수 있다.

그리고 이번에 유효성 컨트롤에 새로 도입된 개념인 ValidateGroup이라는 속성때문인지..이 js파일의 코드가 많이 바뀌었다.
관심있는 분들은 스크립트 이벤트를 추적해보는것도 재미 있을듯...

아래 코드를 살펴 보도록 하자..

[소스코드]


        private const string AlertScript = @"
function Page_ClientValidate(validationGroup) 
{
    var i, val;
    var errorFocusControl = null;
    var boxErrorMessage;
    Page_InvalidControlToBeFocused = null;

    if (typeof(Page_Validators) == 'undefined') 
    {
        return true;
    }
    for (i = 0; i < Page_Validators.length; i++) 
    {
        val = Page_Validators[i];
        ValidatorValidate(val, validationGroup, null);
        if (errorFocusControl == null && !val.isvalid)
        {
            errorFocusControl = document.getElementById(val.getAttribute('controltovalidate'));
            boxErrorMessage = val.getAttribute('errormessage');
        }
    }
    ValidatorUpdateIsValid();
    ValidationSummaryOnSubmit(validationGroup);
    Page_BlockSubmit = !Page_IsValid;
    if (errorFocusControl != null)
    {
	    alert(boxErrorMessage);
        if(typeof(val.focusOnError) == 'string' && val.focusOnError == 't')
        {
            errorFocusControl.focus();
        }
    }
    return Page_IsValid;
}";

//---------------------원본-------------------------------
function Page_ClientValidate(validationGroup) {
    Page_InvalidControlToBeFocused = null;
    if (typeof(Page_Validators) == "undefined") {
        return true;
    }
    var i;
    for (i = 0; i < Page_Validators.length; i++) {
        ValidatorValidate(Page_Validators[i], validationGroup, null);
    }
    ValidatorUpdateIsValid();
    ValidationSummaryOnSubmit(validationGroup);
    Page_BlockSubmit = !Page_IsValid;
    return Page_IsValid;
}




아래쪽에 있는 메서드와 비교해보자..
먼저
var errorFocusControl = null;
var boxErrorMessage;
라는 필드가 생성되었다.
너무나 직관적이지만..첫번째 필드는 예외가 일어난 컨트롤이고 두번째 필드는 그때 보여줄 메시지이다.

if (errorFocusControl == null && !val.isvalid)
{
errorFocusControl = document.getElementById(val.getAttribute('controltovalidate'));
boxErrorMessage = val.getAttribute('errormessage');
}

이 코드로 예외가 일어 났을때 두개의 필드에 값을 입력하게 된다.
if (errorFocusControl != null)
{
alert(boxErrorMessage);
if(typeof(val.focusOnError) == 'string' && val.focusOnError == 't')
{
errorFocusControl.focus();
}
}
마지막으로 이 코드에서 alert을 띄우고 SetFocusError가 true로 세팅되었을때
포커스를 이동시킨다.

뭐 별로 어려울건 없는 코드라고 볼 수 있겠다.

AddAttributesToRender() 라는 메서드는 기본적으로 RequiredFieldValidator에 정의되어 있는 메서드로 설명은 스킵한다.

이제 봐야 할 메서드는 OnPreRender() 메서드이다.

[소스코드]

        protected override void OnPreRender(EventArgs e)
        {
            base.OnPreRender(e);
            if (base.RenderUplevel && !this.Page.ClientScript.IsClientScriptBlockRegistered("AlertKey"))
            {
                this.Page.ClientScript.RegisterClientScriptBlock(typeof(BaseValidator), "AlertKey", AlertScript, true);
            }
        }


중요한 코드이긴 하지만 내용은 별거 아니다.
앞서 생성해준 스크립트를 클라이언트스크립트에 등록해 주는 메서드이다.

중복 등록을 막기위하여 스크립트에 "AlertKey"라고 명명을 하였다.



구현환경
.NET Framework 2.0
Microsoft Visual Studio.NET 2005
Microsoft Windows XP SP2



마지막 업데이트 : (9/11/2006 11:45:55 AM)

TAG : 없음



Trackback 보기 (0)
댓글 보기 (0)
댓글 쓰기

Controls 개요 Ver 2.0.5.0

현재 주소 복사
트랙백 주소 복사
방실이님의 글 (9/11/2006 10:43:27 AM) Viewing : 2746
현재 이 홈페이지에서 사용되는 커스텀 컨트롤은 총 5개이다.
이중에 Controls 네임스페이스에 속한 컨트롤은 3개이다.
한개의 TextBox와 2개의 Validator이다.
남은 2개의 컨트롤은 인증관련 컨트롤이어서 Accounts 어셈블리에 속해 있다. 네임스페이스는 Controls이고..

TextBox는 예전에 소스를 공개했던 네오프레임워크에서 시작을 했다.
사실 그전엔 커스텀 컨트롤을 만들 필요를 별로 못 느꼈으나..
공개된 소스를 보니..괜찮을꺼 같다는 생각이 들어서..만들게 되었다.

그 틀은 네오프레임워크의 TextBox와 같으나 내부는 완전히 다르다고 봐도 된다..ㅡ.ㅡ;
먼저 mask.htc파일을 조금 바꿔서(사실 많이 바꾸었다.ㅡ.ㅡ;) 컨트롤을 재작성 했다..

이후 TextBox를 설명할때..설명하도록 하겠다.

그리고 2개의 Validator컨트롤이 있는데
CompareValidator와 RequiredFieldValidator이다.
이 컨트롤을 재정의한 이유는..

기본적으로 경고 문구를 alert으로 쓰기 위함이다.
단지 이뿐이다..ㅡ.ㅡ;
다른 Validator도 있지만..다른 것은 별로 쓸일이 없어서...이것 2개만 사용했다.

1.x버전에서는 좀 다른 방식으로 재정의를 했는데..
2.0에서는 ValidateGroup이라는게 생겨서 처음에 좀 애를 먹었다..

그래서 고생한 결과 결정한것이 현재의 이 방식이다..별로 좋은 코딩법은 아닌것 같다..ㅡ.ㅡ;

마지막 업데이트 : (9/11/2006 11:59:05 AM)

TAG : 없음



첨부 파일 보기 (1)
Trackback 보기 (0)
댓글 보기 (0)
댓글 쓰기

Controls Ver 2.2

현재 주소 복사
트랙백 주소 복사
방실이님의 글 (12/21/2006 1:58:20 PM) Viewing : 1966

특별한건 아니고...ㅡ.ㅡ;;
VS에서 컨트롤에 보여지는 이미지를 기본 이미지에서 원본 이미지로 바꾸었다.
기능상의 변화는 없고..

    1     /// <remarks>06.12.20 - ToolboxBitmap 추가 - 방실</remarks>

    2     [ToolboxBitmap(typeof(ExTextBox), "Resources.TextBox.bmp")]

    3     [ToolboxData("<{0}:ExTextBox runat=server ></{0}:ExTextBox>")]

    4     [Designer(typeof(ExTextBoxControlDesigner))]

    5     [DefaultProperty("ID")]

    6     public class ExTextBox : TextBox

에서  ToolboxBitmap 어트리뷰트를 추가 한 것이다..
물론 뒤에 있는 경로에 TextBox.bmp라는 비트맵 리소스가 있어야 한다.
헌데...
정확히는 알 수 없으나 이 어트리뷰터의 위치에 따라 이미지가 보여지고 안보여지고 그러는 듯 하다.

Accounts에 있는 로그인 컨트롤도 변경하였는데..이 컨트롤은 이미지가 보여지지 않았다..
이 또한 이상하게 생각되어 삽질을 하였지만..결국...해결법을 못 찾았다..ㅡ.ㅡ;;


마지막 업데이트 : (1/11/2007 2:06:55 PM)

TAG : 없음



첨부 파일 보기 (1)
Trackback 보기 (0)
댓글 보기 (0)
댓글 쓰기



<< < 1 2 > >>