Trading 시스템을 내가 아닌 제 3자의 사용자적 입장에서 사용하도록 시뮬레이션 해 보았을 때
자식 Form을 새로 띄워서 값을 입력 받거나 확인할 수 있게 하는 작업이 많이 필요하단 것을 알게 되었다.
(기능적으로 그렇지만 보기에, 사용하기에 신규Form을 보여주는 것이 더 깔끔한...)
- 부모 Form : Form1 (Delegate Test)
- 자식 Form : Form2 (Login)
테스트 구현 방식은
부모 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)
{
}
}
}
[ 결과 ]
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에 전달
}
}
}
[ 결과 ]
나도 C#을 처음 해보는 것이기에 더 좋고, 간단하며, 오류 없는 방법이 있을지는 모르겠다.
Trading 시스템의 '사용자 로그인' 부분을 구현하면서 필요한 기능이었기에 어떻게 활용하였는지는
아래 링크에서 확인해 보자.
'C#' 카테고리의 다른 글
[C#] 클래스 배열, 객체 배열, Null Reference Exception (0) | 2020.08.13 |
---|---|
[C#] 다른 파일, 다른 클래스 값/함수 사용 (1) | 2020.06.28 |
[C#] MAC Address 가져오기 (0) | 2020.06.15 |
[C#] Class, 클래스, 구조체 (0) | 2020.06.08 |
[C#] 팝업창, 새로운 Form 열기, 모달vs모달리스 (0) | 2020.06.01 |