웹페이지 디자인과 비슷한 느낌으로 메인페이지가 있고 왼쪽의 메뉴를 클릭하면 오른쪽의 페이지만 변경되는 형식을 만들고자 오른쪽 페이지를 유저컨트롤로 디자인 해봤다.
중요한 문제가 있는데 곤란했던 것을 몇가지 정리해두면 다음과 같다.
- 메인에서 사용하는 개체를 유저컨트롤로 전달하지 않으면 에러가 난다.
- 유저컨트롤은 자동으로 갱신이 되지 않고 Visual 프로퍼티로 true,false를 설정한다.
- 유저컨트롤을 필요에 따라서 보이거나(show) 숨기거나(hide) 하는 방식이다.
- 유저컨트롤을 수동으로 갱신하지 않으면 이전vp에 사용한 흔적이 그대로 남는다.
- 유저컨트롤에서 다른 유저컨트롤을 불러서 표시하고 싶을 때는 Parent(main_form)에 유저컨트롤을 추가해서 표시해야 한다.
- 유저컨트롤에서 다른 유저컨트롤을 불러온 경우, 기존의 Parent 폼을 한 번 닫아주고 새로 생성하는 것이 좋음. 안 그러면 페이지 구성이 꼬이더라...(더 좋은 방법이??)
예제소스 : main_form.cs (일부)
using System.Windows.Forms;
namespace FourTypesApp
{
public partial class main_form : Form
{
// 유저컨트롤 개체를 설정함.
home_uc_form HomeUcForm = new home_uc_form();
mypage_uc_form MypageUcForm = new mypage_uc_form();
typecheck_info_uc_form TypeCheckInfoUcForm = new typecheck_info_uc_form();
typecheck_question_uc_form TypeCheckQuestionUcForm = new typecheck_question_uc_form();
typeinfo_uc_form TypeInfoUcForm = new typeinfo_uc_form();
contents_uc_form ContentsUcForm = new contents_uc_form();
private void main_form_Load(object sender, EventArgs e)
{
// 메인페이지가 로딩될 때 각 유저컨트롤을 생성, 필요에 따라서 객체와 Visible을 설정한다.
// 홈 유저컨트롤
HomeUcForm.memberObj = this.member;
panel_content.Controls.Add(HomeUcForm);
HomeUcForm.Visible = true;
// 체질체크 유저컨트롤
TypeCheckQuestionUcForm.memberObj = this.member;
panel_content.Controls.Add(TypeCheckQuestionUcForm);
TypeCheckQuestionUcForm.Visible = false;
// 메인바에 사용자명을 표시, 즉 이 사용자 개체를 각 유저컨트롤에 전달하지 않으면 에러가 난다.
lb_username.Text = this.member.UserName + "さん、こんにちは!";
}
private void icon_home_Click(object sender, EventArgs e)
{
// 클릭하면 유저컨트롤이 표시되게 함, 먼저 객체를 넘기고
HomeUcForm.memberObj = this.member;
// 각 유저컨트롤의 표시여부를 설정해준다.
HomeUcForm.Visible = true;
MypageUcForm.Visible = false;
TypeCheckInfoUcForm.Visible = false;
TypeCheckQuestionUcForm.Visible = false;
TypeInfoUcForm.Visible = false;
ContentsUcForm.Visible = false;
}
private void icon_check_Click(object sender, EventArgs e)
{
TypeCheckInfoUcForm.memberObj = this.member;
HomeUcForm.Visible = false;
MypageUcForm.Visible = false;
TypeCheckInfoUcForm.Visible = true;
TypeCheckQuestionUcForm.Visible = false;
TypeInfoUcForm.Visible = false;
ContentsUcForm.Visible = false;
}
private void icon_copyright_Click(object sender, EventArgs e)
{
// 유저컨트롤이 아닌 일반 폼을 여는 방법. 메인을 숨기고 폼을 생성해서 보여주는 방식.
this.Hide();
info_form InfoForm = new info_form();
InfoForm.memberObj = member;
InfoForm.Show();
}
}
}
예제소스 : typecheckinfo_uc_form.cs (유저컨트롤 안에서 다른 유저컨트롤을 표시할때)
private void btn_checkstart_Click(object sender, EventArgs e)
{
TypeCheckQuestionUcForm.memberObj = this.member;
// main_form에 새로운 유저컨트롤을 추가해준다.
Parent.Controls.Add(TypeCheckQuestionUcForm);
this.Visible = false;
TypeCheckQuestionUcForm.Visible = true;
}
예제소스 : typecheckquestion_uc_form.cs (유저컨트롤에서 불려온 하위페이지)
private void btn_checkend_Click(object sender, EventArgs e)
{
// 현재 유저컨트롤을 숨긴다.
this.Visible = false;
// 이미 열려있는 main_form을 찾아서 일단 닫아준다.
Form OldMainForm = Parent.FindForm();
OldMainForm.Close();
// 새로운 메인 폼을 생성한다.
main_form MainForm = new main_form();
MainForm.memberObj = this.member;
MainForm.Show();
// 새로운 홈 유저컨트롤을 생성해서 보여준다.
home_uc_form HomeUcForm = new home_uc_form();
HomeUcForm.Visible = true;
}
예제소스 : mypage_uc_form.cs (유저컨트롤 안에 있는 폼을 초기화 하기)
private void ResetForm()
{
// 예를 들어 텍스트박스나 라디오박스, 리스트박스를 변경한 후 다른 유저컨트롤을 표시했다가 돌아오면
// 변경했던 값이 그대로 표시되어, 실제 데이터베이스에 있는 값과 다른 문제가 생긴다.
// 초기화 하는 방법에는 여러가지가 있지만, 여기서는 유저컨트롤의 Visible 속성이 변하면(즉, 유저컨트롤을 숨기거나 하면)
// 각 폼값을 초기화 해 주는 함수를 작성해서 호출한다.
tb_username.Text = member.UserName;
tb_password.Text = member.PassWord;
cb_age.SelectedIndex = Convert.ToInt32(member.Generation.ToString());
if (member.Gender.TrimEnd() == "M")
{
rb_men.Checked = true;
rb_women.Checked = false;
}
else
{
rb_men.Checked = false;
rb_women.Checked = true;
}
}
private void mypage_uc_form_VisibleChanged(object sender, EventArgs e)
{
// 폼을 초기화 하는 함수를 호출한다.
this.ResetForm();
}
댓글
댓글 쓰기