티스토리 뷰

Development/.NET

Component.DesignMode Property

jakard 2009. 10. 27. 15:32

UserControl을 상속받아서 어떤 컨트롤을 만들때, 때로는 Control이 Load되는 시점에서 DB로 부터 Control에 속한 ComboBox나 Grid를 초기화하는 코드들을 집어 넣어야 할 때가 있습니다.
그래서 OnLoad 함수를 오버로드하거나 이벤트 대리자 함수에서 위의 과정들을 구현하게 됩니다.
이제 UserControl이 만들어졌으니 마르고 닳도록 써먹어야지 하면서 Form위에도 올리고, 다른 UserControl에도 올립니다.
실행을 해보니 정상적으로 동작을 합니다.

하지만 해당 UserControl을 올린 Form의 Layout을 수정할 일이 생겨서 다시 Form의 디자이너 창을 띄웁니다.
그런데 이게 왠일?


이런 에러메세지가 나면서 작업을 할 수가 없게 됩니다.
이유는 아시겠지만 디자이너창에서 Form을 띄울때 UserControl의 OnLoad가 실행되기 때문입니다.

이럴 때 System.ComponentModel.Component의 DesignMode Property를 자주 사용하였습니다.

        protected override void OnLoad(EventArgs e)
        {
            if (this.DesignMode == false)
            {
                // Do Something....
            }
        }

이런식으로 말이죠.

하지만 이 DesignMode 속성도 믿을만한게 못 됩니다.
첫째, 이런 코드들을 생성자에서 사용할 때는 DesignMode로 제어할 수가 없습니다. 생성자내에서 DesignMode의 값은 언제나 False입니다.
생성자가 실행된 후에 DesignMode의 값이 셋팅되기 때문입니다.

두번째는 UserControl(A)을 올려둔 다른 UserControl(B)을 다른 UserControl(C)이나 Form(C)에 올려놓을 때 발생합니다. 이 때는 첫번째 UserControl(A)에서 DesignMode로 제어해봐야 C에 해당하는 UserControl이나 Form에서는 마찬가지로 디자이너 창에서 에러가 발생하게 됩니다.


이런 경우에 System.ComponentModel.LicenseManager의 UsageMode속성을 사용하면 만족스런 결과를 얻을 수 있습니다.
아까 위의 코드를 다음과 같이 고치면 되겠습니다.

        protected override void OnLoad(EventArgs e)
        {
            if (LicenseManager.UsageMode == LicenseUsageMode.Designtime)
            {
                // Do Something....
            }
        }