본문 바로가기
소프트웨어

Parent Toolbar를 클릭해서 Mdi Child에 있는 함수를 호출하자

by 알 수 없는 사용자 2009. 3. 3.
320x100
# 들어가는 말

영어로 찾아본건 " How to access methods of MDI Child from by MDI Parent Toolbar "
http://social.msdn.microsoft.com/Forums/en-US/winforms/thread/956363d8-52aa-4127-ac2b-0131ef1d795f/

링크는 문제의 해결책이 아니네요.
얼마 전에 훈스닷넷과 데브피아에 글을 썻지요. 그런데 설명이 좋지 않았는 지 좋지 않은 답변만 얻었어요.
(사실 데브피아에서는 질문자는 추상화 클래스와 인터페이스를 잘못쓰시네요.. 이러는둥 자존심이 상해서 열심히 방법을 강구했죠. )



# 문제

문제는 이겁니다.
Mdi Form을 만들면 Parent폼과 Child폼으로 구성할 수 있죠( sdi가 아닌 mdi환경이니깐요 )
그런데 Toolbar는 공통적으로 쓰니깐 부모폼에 달았습니다.
툴바에는 조회, 삭제, 저장 버튼으로 구성을 했습니다.
Child폼을 띄운후, 활성화 되어있는 폼에서 툴바를 클릭하면 (조회클릭시)
Child폼안에 구현된 Toolbar_Find라는 함수를 호출하는 겁니다.

여기까지는 참쉽죠잉~

그런데 문제가 생겼습니다.
툴바에 버튼이 더 올라갑니다. 라인추가, 라인삭제, 인쇄, 기타 버튼 등등
그리고 앞으로 얼마나 더 올라갈지 모릅니다.


그것도 모르고 인터페이스로 구현한 것이였습니다.
 
  public interface Test
    {
        void Toolbar_Find();
        void Toolbar_New();
        void Toolbar_Delete();
    }

// 활성화된 폼을 받습니다.
Test childForm = (Test)this.ActiveMdiChild;
childForm.Toolbar_New(); //함수호출


이렇게 되었다고 할때 인터페이스에 함수가 선언 될때 마다 Child폼에서는 그함수를
쓰지 않더라구 원형을 구현하여야 합니다.

요점은 이렇습니다. 자식폼에서는 쓰지도 않는 함수원형도 선언하기 싫은겁니다.

이때 폼을 상속받은 버추얼 함수를 구현하여서 해결하였습니다.

public class MdiChildBaseForm : Form
    {
        public virtual void Toolbar_New()
        {
        }

        public virtual void Toolbar_Find()
        {
        }

        public virtual void Toolbar_Delete()
        {
        }

        public virtual void Toolbar_Save()
        {
        }

        public virtual void Toolbar_LineDel()
        {
        }

        public virtual void Toolbar_LineAdd()
        {
        }

        public virtual void Toolbar_Print()
        {
        }

        public virtual void Toolbar_ExportToExcel()
        {
        }
    }


렇게 폼을 상속받은 MdiChildBaseForm 를 자식폼에 상속을 해주고
자식폼에서는 override 해서 재정의하는 거죠~

이것도 몰라서 고생을 좀했습니다.

하지만 의문점이 남는 것이 있습니다.
부모폼에서
MdiChildBaseForm 클래스를 정의하면 리소스가 제대로 보이지 않는 겁니다.
그래서 cs 클래스파일을 추가하여 거기에 정의한후 사용하였습니다.

정확한 이유는 모르겠으나 폼클래스를 상속받으면서
버추얼로 선언하기때문에 디자인보기를 할경우 리소스가 제대로 보이지 않는것 같습니다.


댓글