2021년 목표설정

이미지
기본적으로 작년에 달성하지 못한 것들을 하려고 생각중인데..코로나가 언제까지 이어질지, 한국이나 북해도는 갈 수 있을지..자격증은 응시 가능할지..여러가지가 불확실하다. 2021년은 무엇보다 정신적인 부분과 경제적인 부분에 중점을 두고 조금 더 치열하게 지내보고 싶다. 일본나이로도 30대 마지막 해, 이제 불혹에 접어드는 나이..복잡하지만 심플하게. 육체적목표 : 트라이에슬론 스탠다드 도전하기 정신적 : 자격증2개 도전 + 자체개발 서비스 론칭 가족적 : 가정의 평화를 유지하기 경제적 : 외식과 유흥비를 줄이고 부수입을 늘려서 결과적으로 저축하기 사회적 : 목표세미나를 포함해서 민단과 개인인맥의 활성화와 교류를 촉진하기

[C#] 유저컨트롤을 사용하는 방법 정리

웹페이지 디자인과 비슷한 느낌으로 메인페이지가 있고 왼쪽의 메뉴를 클릭하면 오른쪽의 페이지만 변경되는 형식을 만들고자 오른쪽 페이지를 유저컨트롤로 디자인 해봤다.



중요한 문제가 있는데 곤란했던 것을 몇가지 정리해두면 다음과 같다.

  • 메인에서 사용하는 개체를 유저컨트롤로 전달하지 않으면 에러가 난다. 
  • 유저컨트롤은 자동으로 갱신이 되지 않고 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 senderEventArgs 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 senderEventArgs 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 senderEventArgs 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 senderEventArgs e)
        {
            // 유저컨트롤이 아닌 일반 폼을 여는 방법. 메인을 숨기고 폼을 생성해서 보여주는 방식.
            this.Hide();
            info_form InfoForm = new info_form();
            InfoForm.memberObj = member;
            InfoForm.Show();
        }
    }
}

예제소스 : typecheckinfo_uc_form.cs (유저컨트롤 안에서 다른 유저컨트롤을 표시할때)
private void btn_checkstart_Click(object senderEventArgs 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 senderEventArgs 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 senderEventArgs e)
{
    // 폼을 초기화 하는 함수를 호출한다.
    this.ResetForm();
}

댓글

이 블로그의 인기 게시물

[메모] PostgreSQL에서 Insert 하는 경우 자동채번 PK가 중복에러 나는 경우

[C# & LINQ] 랜덤으로 데이터를 한 개 추출하는 방법

[react-native] uuid 생성이 에러가 날 때 대처법