Trading 시스템을 내가 아닌 제 3자의 사용자적 입장에서 사용하도록 시뮬레이션 해 보았을 때

자식 Form을 새로 띄워서 값을 입력 받거나 확인할 수 있게 하는 작업이 많이 필요하단 것을 알게 되었다. 

(기능적으로 그렇지만 보기에, 사용하기에 신규Form을 보여주는 것이 더 깔끔한...)

 

  • 부모 Form : Form1 (Delegate Test) 

'로그인' 버튼과 결과를 출력해줄 TextBox를 갖는 부모 Form

  • 자식 Form : Form2 (Login)

'아이디'와 '비밀번호'를 입력할 수 있는 TextBox와 로그인 버튼을 갖는 자식 Form

 

테스트 구현 방식은

부모 Form(Form1)에서 아이디 값을 넘겨주어 자식 Form(Form2)에서는 아이디가 자동으로 입력되고

자식 Form에서 비밀번호 입력 후 '로그인' 버튼을 누르면 

자식 Form이 사라짐과 동시에 부모 Form의 TextBox에 입력받은 비밀번호를 출력하도록 한다. 

 

그러면 두 Form 간에 데이터를 주고 받는 테스트가 완료!

 

1. 부모 Form -> 자식 Form

 

여러 다른 방법이 있는지는 모르겠지만, 내가 구현한 방법은 생각보다 간단하다.

 

[ 부모 Form ]

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace delegate_test
{
    public partial class Form1 : Form
    {
        static string static_id = "brandon";          // 자식 Form에 넘겨줄 ID 값
        Form2 Child = new Form2(static_id);           // 자식 Form 생성자

        public Form1()
        {
            InitializeComponent();

        }

        private void 로그인ToolStripMenuItem_Click(object sender, EventArgs e)  // 로그인 버튼을 눌렀을 때
        {
            Child.Owner = this;
            Child.ShowDialog();                     
        }
    }
}

[ 자식 Form ]

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace delegate_test
{
    public partial class Form2 : Form
    {
        string global_id = string.Empty;

        public Form2(string id)           // 자식 Form의 생성자 - 부모 Form으로부터 값을 전달 받음
        {
            InitializeComponent();
            global_id = id;
        }

        private void Form2_Load(object sender, EventArgs e) // Form2가 보여질때 설정
        {
            textBox1.Text = global_id;    // Form2에 부모 Form으로부터 받은 id 값을 미리 설정
        }

        private void button1_Click(object sender, EventArgs e)
        {

        }
    }
}

[ 결과 ]

자식 Form(Login)이 표시됨과 동시에 부모 Form에서 받은 'brandon'이란 ID 값이 자동으로 입력됨.

 

2. 자식 Form -> 부모 Form

 

이 경우에는 delegate라는것을 사용하는데, C++에서의 함수포인터와 비슷한 개념이다.

'대리자'라는 뜻의 이 delegate는 메소드를 대신해서 호출해 주는 역할을 한다고 생각하면 된다. 

 

[ 부모 Form ]

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace delegate_test
{
    public delegate void LoginGetEventHandler(string id, string password); // 자식 Form EventHandler

    public partial class Form1 : Form
    {
        static string static_id = "brandon";
        Form2 Child = new Form2(static_id);

        public Form1()
        {
            InitializeComponent();
            Form2.LoginGetEvent += new LoginGetEventHandler(this.Login_Process); // EventHandler 등록
        }

        private void 로그인ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            Child.Owner = this;
            Child.ShowDialog();                     
        }

        private void Login_Process(string id, string password) // Event 발생 시, 처리할 함수 선언
        {
            string test_result = string.Empty;
            test_result = String.Format("ID : {0}, PW : {1}", id, password);
            textBox1.Text = test_result;  // 자식 Form에서 수신한 값 표시
        }
    }
}

[ 자식 Form ]

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace delegate_test
{
    public partial class Form2 : Form
    {
        public static LoginGetEventHandler LoginGetEvent;  // 부모 Form에서 등록한 EventHandler 선언

        string global_id = string.Empty;

        public Form2(string id) 
        {
            InitializeComponent();
            global_id = id;
        }

        private void Form2_Load(object sender, EventArgs e) 
        {
            textBox1.Text = global_id;
        }

        private void button1_Click(object sender, EventArgs e) // 로그인 버튼을 눌렀을 때
        {
            this.Close();
            LoginGetEvent(textBox1.Text, textBox2.Text);  // 입력된 ID와 PASSWORD 값을 EventHandler에 전달
        }
    }
}

[ 결과 ]

비밀번호를 'asdf1234!@#$'로 입력 후 로그인 버튼 클릭
자식 Form에서 입력한 값을 부모 Form에서 받아서 출력

 

나도 C#을 처음 해보는 것이기에 더 좋고, 간단하며, 오류 없는 방법이 있을지는 모르겠다. 

Trading 시스템의 '사용자 로그인' 부분을 구현하면서 필요한 기능이었기에 어떻게 활용하였는지는

아래 링크에서 확인해 보자. 

Posted by [ 브랜든 ]
,