레드후디의 탐구생활

[.NET]일괄 초기화 (batch initialization) 본문

DEVELOPMENT/dot NET

[.NET]일괄 초기화 (batch initialization)

레드후디 2011.02.27 15:07

  최종적으로 InitializeComponent 메서드 안으로 직렬화되어 들어온 코드는 개체 단위로 묶여진 속성들을 알파벳 순서로 나열하게 되어있습니다.

 

  만약 Efg 라는 Property의 값이 10이고, Abc 라는 Property의 값은 Efg의 값보다 크면 안되는 상황일때 Abc에서 유효성 검사를 하게된다면.. InitializeComponent 메서드 안에서는 알파벳 순서이기때문에  Efg는 아직 값이 들어가지 않은 상태로 참조가 되어지고 Error를 뿜어내게 됩니다.

 

  이럴때는 일괄 초기화를 활용 하세요!

 

방법은.. "ISupportInitialize Interface"를 구현하면 됩니다.

BeginInit 메서드 -  초기화 일괄 모드가 시작된다는 신호.

EndInit 메서드 - 초기화 일괄 모드가 끝난다는 신호.


EndInit 메서드에 적절한 일괄 유효성 검사 로직을 작성하시면 됩니다. 

예제 소스) 오랜만에 보는 VB.NET 코드;;;
 Public Class cButton

    Inherits Control

    Implements ISupportInitialize

  

  

#Region "ISupportInitialize"

    

    Public Sub BeginInit() _

    Implements System.ComponentModel.ISupportInitialize.BeginInit

 

    End Sub


 

    Public Sub EndInit() Implements ISupportInitialize.EndInit


        If Not Me.DesignMode Then

            '일괄 유효성 검사

            If mRadius > (Me.Height / 2) Then

                mRadius = (Me.Height / 2)

            End If

        End If


    End Sub

 

#End Region

 

End 



위와 같이 ISupportInitialize Interface 를 구현하시고 나면, 아래와 같이 InitializeComponent에 자동으로 밑줄 친 코드가 생깁니다. 실행하면 일괄 초기화가 끝나고 난 뒤 EndInit() 메서드가 호출 되어 유효성 검사(EndInit에 구현한 코드 실행)를 합니다.

    '참고다음 프로시저는 Windows Form 디자이너에 필요합니다.

    'Windows Form 디자이너를 사용하여 수정할 수 있습니다. 

    '코드 편집기를 사용하여 수정하지 마십시오.

    Friend WithEvents CButton1 As CustomButton.cButton

    <System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()

        Me.CButton1 = New CustomButton.cButton

        CType(Me.CButton1, System.ComponentModel.ISupportInitialize).BeginInit()

        Me.SuspendLayout()

        '

        'CButton1

        '

        Me.CButton1.Border = 2

        Me.CButton1.BorderColor = System.Drawing.Color.FromArgb(CType(113,Byte), CType(129, Byte), CType(138, Byte))

        Me.CButton1.ButtonStyle = CustomButton.cButton.ButtonStyleEnum.CUSTOM

        Me.CButton1.cBackColor = System.Drawing.Color.FromArgb(CType(240, Byte),CType(240, Byte), CType(233, Byte))

        Me.CButton1.Icon = Nothing

        Me.CButton1.IconSize = 16

        Me.CButton1.Location = New System.Drawing.Point(80, 104)

        Me.CButton1.Name = "CButton1"

        Me.CButton1.OverBorderColor = System.Drawing.Color.FromArgb(CType(250,Byte), CType(170, Byte), CType(50, Byte))

        Me.CButton1.Radius = 48

        Me.CButton1.Size = New System.Drawing.Size(96, 96)

        Me.CButton1.TabIndex = 0

        Me.CButton1.Text = "CButton1"

        Me.CButton1.ThemeColor = CustomButton.Theme.ThemeEnum.NORMAL

        '

        'Form2

        '

        Me.AutoScaleBaseSize = New System.Drawing.Size(6, 14)

        Me.ClientSize = New System.Drawing.Size(292, 273)

        Me.Controls.Add(Me.CButton1)

        Me.Name = "Form2"

        Me.Text = "Form2"

        CType(Me.CButton1, System.ComponentModel.ISupportInitialize).EndInit()

        Me.ResumeLayout(False)

 

    End Sub



위 예제의 경우 Radius가 me.Height의 절반인 값보다 크면 Radius에 me.Height/2 값을 넣어야 하는 경우 인데, Size가 Radius보다 늦게 수행되기 때문에 원하는 결과가 나오지 않아서 일괄 초기화를 사용한 경우입니다. 

또는, 그냥 간단하게 꼼수로... Radius Property에서 유효성 검사를 하되 Radius와 Size보다 나중에 수행되는 Property를 이용하여 [if Text="" then Exit Property]를 사용해도 되겠죠;; ㅋㅋㅋ


'DEVELOPMENT > dot NET' 카테고리의 다른 글

[.NET]일괄 초기화 (batch initialization)  (0) 2011.02.27
[WMI] 자신의 MAC Address 얻기  (0) 2011.01.27
[.NET] AppDomain의 실행URL(현재URL)  (1) 2011.01.21
[.NET] Assembly 동적 로드  (0) 2011.01.21
0 Comments
댓글쓰기 폼