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:

Related Posts:

  • 구글 블로그(Blogger) 포스트에 파일 첨부 기능 적용하기구글 블로그에서는 파일 첨부는 구글 드라이브를 통해 적용합니다. 구글 드라이브는 따로 가입 절차가 필요하지 않으니 사용중인 구글 계정 그대로 시작하실수 있습니다 1. 구글 드라이브 접속 - (https://drive.google.com/drive) - 구글 드라이브에 접속하시면 다음과 같은 메인 화면을 보실… Read More
  • 자동으로 환율 정보를 업데이트 하는 환율 계산기 만들기 (C# ) 요즘 여행 계획을 짜다 보니 생각보다 환율 정보를 자주 찾게 되더라구요 간편하게 네이버 환율 계산기에 접속하여 사용할 수 있으나 필요성도 느끼고 생각이 난김에 C#으로 간단한 환율 계산기를 만들어 보겠습니다. 1. 환율 계산기에 필요한 기능 - 인터넷이 연결되면 최신 환율 정보를 가져와서… Read More
  • 구글 블로그 카테고리 적용하기 (Blogger Category, 접기기능) (완성하여 현재 블로그에 적용중인 카테고리) 구글 블로그를 꾸며 나가는데 처음 만난 장벽은 카테고리 기능이였습니다 항상 블로그를 운영할땐 카테고리 메뉴를 기본으로 블로그 목적이나 내용들을 채워나갔었던 경험이 있어서 그런지 카테고리가 없는 메인 화면을 보면 답답함을 느꼈습니다 안타깝게도 … Read More
  • 블로그(Blogger) 및 웹 페이지의 위치를 수정해주는 탑(Top) 버튼 만들기 해당 블로그에 적용된 탑(Top) 버튼 테스트 영상 위 영상과 같이 사용자가 일정한 길이만큼 스크롤을 통해 아래로 내려갔을 경우 자동으로 원하는 위치(가장 윗부분)에 부드럽게 이동시켜주는 기능을 하는 버튼을 만들어 보겠습니다. 탑 버튼은 직접 HTML 문서에 태그를 작성한뒤 대상 태그의 스타일을 CSS문… Read More
  • C# 하위 폼에서 상위 폼의 매서드 호출시키기 (대리자 선언)하나의 폼 안에 많은 자식 폼들을 생성하여 각각 팝업이나 화면 일부분을 구현 하는 경우가 많습니다. 부모 폼에서는 생성한 자식 폼들의 인스턴스를 가지고 있기 때문에 자식 폼을 컨트롤 하고 객체에 접근하기가 매우 간단합니다. 하지만 반대로 자식 폼 입장에서는 부모 폼의 인스턴스를 가지고 있지 않을 경우엔… Read More

댓글 1개: