2017년 9월 24일 일요일

C# 폼 이름으로 (String 형태) 해당 객체를 찾아 인스턴스 만드는 방법

디비 조회 결과에서든지 하드 코딩이든 문자열로 된 폼이나 원하는 객체의 이름만 가지고 있는 상황에서 해당 객체(폼)을 찾아 인스턴스를 만들어야 할 경우가 많습니다.

자바의 리플렉션(Reflection)과 똑같이 C#에서도 프로그램이 실행되면서 선언되었거나, 실행에 필요한 모든 객체에 대하여 어셈블리를 통해 정보를 확인, 인스턴스 생성, 형식 변경 등 필요한 작업을 할 수 있습니다.

사용자에 의해 이벤트 발생시 사용자가 선택한 이름으로 된 폼을 임포트 하는 예제를 만들어 보겠습니다.


⧫ 기능 정의
1. 마스터 폼에 여러가지 폼 이름이 적힌 버튼을 사용자가 클릭할수있다.
2. 버튼 클릭시 해당 이름으로 된 폼을 마스터 폼에 실행한다.
3. 다른 버튼을 클릭하면 2번 과정을 되풀이 한다.



⧫ 구현

1. 마스터 폼 디자인


- 크게 두개의 판넬로 반반씩 위치 시켰으며, 왼쪽 판넬에는 사용자가 폼을 선택할 수 있는 버튼을 두었으며, 오른쪽 판넬에는 선택된 폼이 실행될 공간으로 두었습니다.


2. 서브 폼 디자인


- 마스터 폼에 있는 버튼명과 똑같은 서브폼 두개를 만들었습니다. 두 폼은 각각의 폼 이름을 라벨로 중앙에 보여주도록 하였습니다.


3. 마스터 폼 소스

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
public partial class Form1 : Form
{
    string strFormName = "";
    public Form1()
    {
        InitializeComponent();
    }
    private void button1_Click(object sender, EventArgs e)
    {
        strFormName = "test003.kanadel";
        setForm(strFormName);
    }
    private void button2_Click(object sender, EventArgs e)
    {
        strFormName = "test003.subForm2";
        setForm(strFormName);
    }
    private void button3_Click(object sender, EventArgs e)
    {
        this.panel3.Controls.Clear();
    }
    private void setForm(string strFormName)
    {
        var varPageType = Type.GetType(strFormName);
        var varFormInstance = Activator.CreateInstance(varPageType) as UserControl;
        this.panel3.Controls.Clear();
        this.panel3.Controls.Add(varFormInstance);
        varFormInstance.Dock = DockStyle.Fill;
    }
}

- 각 버튼 클릭 이벤트 부분과 폼 인스턴스 생성하는 매서드 두 부분으로 되어 있습니다.

3# : 폼 이름 변수 선언입니다.
12#, 18# : 각 버튼을 클릭시 폼 이름을 갱신합니다.
13#, 19# : 폼 이름 변수 갱신 후, 인스턴스 생성 매서드를 호출합니다.
29# ~ 30# : 폼 이름을 통해 타입을 확인한 후 UserControl 형으로 인스턴스를 선언합니다.
32# ~ 34# : 선언된 인스턴스를 위치 시킵니다.

@ 폼 이름은 "네임스페이스.폼이름" 형식으로 해야 어셈블리에서 찾을수 있습니다.


4. 서브 폼 소스는 없습니다.


5. 실행

C# 리블렉션 라이브러리에 대한 상세한 정보는 여기를 찾아보시면 됩니다.
(https://msdn.microsoft.com/ko-kr/library/system.reflection.assembly(v=vs.110).aspx)

오타나 잘못된 내용, 질문등은 언제나 환영 입니다. ^^

IT 기술 관련 다른 포스트 보러가기
Share: