ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 미니프로젝트 정리 (조원파트) NewMemberForm
    C# 예제 공부일기 2020. 8. 8. 20:23

    로그인 폼에서 새로운 사용자를 DB상에 추가하고 싶을 때 사용하는 회원가입 폼이다. 주로 Textbox와 콤보박스 그리고 체크박스를 이용한 INSERT가 주를 이룬다,

    public partial class NewMemberForm : Form
        { 
            bool overlapcheck = false; //아이디 중복확인 했는지 확인하기 위한 bool변수
            
            public NewMemberForm()
            {
                InitializeComponent();
    
            }
    
            private void btnCancel_Click(object sender, EventArgs e)
            {
                this.Close();
            }
            private void NewMemberForm_Load(object sender, EventArgs e)
            {
                UpdateCbo();
                txtName.Focus();
            }
            private void btnOK_Click(object sender, EventArgs e)
            {
                if (string.IsNullOrEmpty(txtAge.Text) || string.IsNullOrEmpty(txtAge.Text)
                    || string.IsNullOrEmpty(txtName.Text) || string.IsNullOrEmpty(txtPassword.Text)
                    || (!rdbtnFemale.Checked && !rdbtnMale.Checked) || (cboUSCallPlan.SelectedIndex == -1))
                {
                    MetroMessageBox.Show(this,"빈 값은 저장할 수 없습니다.", "경고", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    return;
                }
                if (overlapcheck == false)
                {
                    MetroMessageBox.Show(this,"중복확인을 해주세요.", "경고", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    return;
                }
                SaveProcess();
                this.Close();
            }

    가장 처음부터 class NewMemberForm에 bool 변수 overlapcheck을 false로 초기화하고 만드는데 중복확인을 하기 위한 부분이다. userTbl에서 기본키는 ID이므로 필수적으로 Insert하기 전에 중복되는 아이디가 있는지 확인해야한다.

     

    위 메소드부터 btnCancel_Click을 누를 경우 회원가입 창을 닫는다. 그 밑에 Load 메소드에서는 폼이 생성될 때 콤보박스에 내용을 채우는 UpdateCbo()와 편의성을 위해 포커스를 가장 윗부분인 이름 텍스트박스에 놓아준다.

     

    그 밑에는 OK 버튼을 눌렀을 때 호출 되는 메소드인데, 텍스트박스가 없거나 비어있는지 확인할 수 있는 메소드 IsNullOrEmpty 메소드를 사용하고 라디오 버튼이 성별 남과 여 중에 하나라도 체크되어있는지 확인 그리고 콤보박스에서 하나라도 선택된다면 Index가 0보다 크기 때문에 -1로 판별한다. 이 모든 것들이 하나라도 안되어 있는게 있다면 빈 값은 저장할 수 없습니다. 라는 메세지박스를 띄우고 다시 OK버튼을 누르기 전으로 돌아간다.  또 한가지 체크해야 할 부분은 overlapcheck이 false라면 아직 중복확인을 하지 않았다는 의미이므로 이 경우 역시 돌아간다.

     

    이 두가지 if문을 통과한다면 본격적으로 INSERT를 하는 부분과 선택한 요금제로부터 세가지 기준을 들고오는 SaveProcess() 메소드를 실행하고 회원가입 창을 닫는다.

     

    다음은 SaveProcess() 메소드이다. 두가지 부분으로 나누어 설명하려고 한다. 첫 부분은 콤보박스에서 선택한 요금제의 세가지 기준을 들고오는 부분이다.

    private void SaveProcess()
            {
                int std1, std2, std3;
    
                using (SqlConnection conn = new SqlConnection(Commons.CONNSTRING))
                {
                    conn.Open();
                    SqlCommand cmd = new SqlCommand();
                    cmd.Connection = conn;
    
                    string strQuery = " SELECT STD1, STD2, STD3 "
                                      + " FROM productTbl "
                                     + " WHERE CallingPlan = @CallingPlan";
    
                    cmd.CommandText = strQuery;
                    SqlParameter paramCalling = new SqlParameter("@CallingPlan", SqlDbType.NVarChar, 50);
                
                    paramCalling.Value = cboUSCallPlan.Text;
                    cmd.Parameters.Add(paramCalling);
    
                    SqlDataReader reader = cmd.ExecuteReader();
    
                    reader.Read();
    
                    std1 = int.Parse(reader[0].ToString());
                    std2 = int.Parse(reader[1].ToString());
                    std3 = int.Parse(reader[2].ToString());
    
                }

    세가지 기준을 저장할 정수형 std1,2,3를 생성하고 데이터베이스와 연결한다.

    파라미터로 cboUSCallPlan.text 즉 콤보박스에 선택한 요금제의 텍스트로 파라미터를 주고 std1,2,3를 SELECT해온다.

    접근하는 테이블은 productTbl이다.

    위 그림에서 선택한 한가지 행의 STD1,2,3를 들고와서 SqlDateReader를 들고와서 std1,2,3에 읽어온 STD1,2,3 를 각각 저장한다.

    using (SqlConnection conn = new SqlConnection(Commons.CONNSTRING))
                {
                    conn.Open();
                    SqlCommand cmd = new SqlCommand();
                    cmd.Connection = conn;
    
                    string strQuery = "INSERT INTO userTbl "
                                               + " (userID, userName, userPassword, userAge, userGender, userMobile, userUSCallPlan, userSearch, STD1, STD2, STD3) "
                                        + " VALUES (@userID, @userName, @userPassword, @userAge, @userGender, @userMobile, @userUSCallPlan, @userSearch, @STD1, @STD2, @STD3)";
    
                    cmd.CommandText = strQuery;
                    SqlParameter paramUserID = new SqlParameter("@userID", SqlDbType.VarChar, 50);
                    paramUserID.Value = txtID.Text;
                    cmd.Parameters.Add(paramUserID);
    
                    SqlParameter paramName = new SqlParameter("@userName", SqlDbType.NVarChar, 20);
                    paramName.Value = txtName.Text;
                    cmd.Parameters.Add(paramName);
    
                    SqlParameter paramPassword = new SqlParameter("@userPassword", SqlDbType.VarChar, 50);
                    paramPassword.Value = txtPassword.Text;
                    cmd.Parameters.Add(paramPassword);
    
                    SqlParameter paramAge = new SqlParameter("@userAge", SqlDbType.Int);
                    paramAge.Value = txtAge.Text;
                    cmd.Parameters.Add(paramAge);
    
                    SqlParameter paramGender = new SqlParameter("@userGender", SqlDbType.NChar, 10);
                    if (rdbtnMale.Checked)
                    {
                        paramGender.Value = rdbtnMale.Text;
                    }
                    if (rdbtnFemale.Checked)
                    {
                        paramGender.Value = rdbtnFemale.Text;
                    }
                    cmd.Parameters.Add(paramGender);
    
                    SqlParameter paramMobile = new SqlParameter("@userMobile", SqlDbType.VarChar, 13);
                    paramMobile.Value = txtMobile.Text;
                    cmd.Parameters.Add(paramMobile);
    
                    SqlParameter paramUSCallPlan = new SqlParameter("@userUSCallPlan", SqlDbType.NVarChar, 50);
                    paramUSCallPlan.Value = cboUSCallPlan.Text;
                    cmd.Parameters.Add(paramUSCallPlan);
    
                    //3
                    SqlParameter paramUserSearch = new SqlParameter("@userSearch", SqlDbType.Bit);
                    paramUserSearch.Value = 0;
                    cmd.Parameters.Add(paramUserSearch);
    
                    SqlParameter paramSTD1 = new SqlParameter("@STD1", SqlDbType.Int);
                    paramSTD1.Value = std1.ToString();
                    cmd.Parameters.Add(paramSTD1);
    
                    SqlParameter paramSTD2 = new SqlParameter("@STD2", SqlDbType.Int);
                    paramSTD2.Value = std2.ToString();
                    cmd.Parameters.Add(paramSTD2);
    
                    SqlParameter paramSTD3 = new SqlParameter("@STD3", SqlDbType.Int);
                    paramSTD3.Value = std3.ToString();
                    cmd.Parameters.Add(paramSTD3);
    
                    cmd.ExecuteNonQuery();
    
                    MetroMessageBox.Show(this,"회원가입이 완료되었습니다.", "환영합니다.", MessageBoxButtons.OK, MessageBoxIcon.Information);
    
                }
            }

    다음은 아이디, 이름(Textbox), 비밀번호(Textbox), 나이(Textbox), 성별(라디오체크박스), 핸드폰번호(Textbox), 사용중인 요금제(콤보박스), 설문지를 했는지 안했는지 확인하는 userSearch(회원가입을 했다면 당연히 설문을 안했을 것이므로 false) 위에서 쿼리문을 통해 들고온 std1,2,3를 userTbl에 그대로 가져다가 넣는다.

     

    private void UpdateCbo()
            {
                using (SqlConnection conn = new SqlConnection(Commons.CONNSTRING))
                {
                    conn.Open();
                    SqlCommand cmd = new SqlCommand();
                    cmd.Connection = conn;
                    cmd.CommandText = " SELECT CallingPlan, Company FROM dbo.productTbl";
                    SqlDataReader reader = cmd.ExecuteReader();
    
                    Dictionary<string, string> temps = new Dictionary<string, string>();
                    while (reader.Read())
                    {
                        temps.Add(reader[0].ToString(), reader[1].ToString());
                    }
    
                    cboUSCallPlan.DataSource = new BindingSource(temps, null);
                    cboUSCallPlan.DisplayMember = "Key";
                    cboUSCallPlan.ValueMember = "Value";
                    cboUSCallPlan.SelectedIndex = -1;
                }
            }

    FormLoad 메소드에 들어있던 콤보박스를 초기화 하는 부분이다. productTbl에서 요금제와, 회사를 들고와서 딕셔너리형의 temps에 읽어온 데이터를 키=요금제 value=회사 형태로 집어넣는다. 그 후 콤보박스에 DataSource를 BindingSource 클래스(temps,null)을 사용해서 집어넣는다.

    생성자 중에서 빨간박스 쳐져있는 저부분을 사용한 것이다. 이렇게 딕셔너리형의 temp를 콤보박스에 묶어준다. 
    "Key"는 당연히 요금제이고 "Value"는 회사가 들어가 있다. 콤보박스에는 Key인 요금제만 보이게 된다.

     

    private void txtAge_KeyPress(object sender, KeyPressEventArgs e)
            {
                if (!char.IsControl(e.KeyChar) && !char.IsDigit(e.KeyChar) && (e.KeyChar == '.'))
                {
                    e.Handled = true;
                }
    
                if(e.KeyChar==(char)13)
                {
                    rdbtnMale.Focus();
                    txtName.BackColor = SystemColors.Control;
                    pnlName.BackColor = SystemColors.Control;
                    lblName.BackColor = SystemColors.Control;
                    pnlID.BackColor = SystemColors.Control;
                    txtID.BackColor = SystemColors.Control;
                    lblID.BackColor = SystemColors.Control;
                    pnlPassword.BackColor = SystemColors.Control;
                    txtPassword.BackColor = SystemColors.Control;
                    lblPassword.BackColor = SystemColors.Control;
                    pnlAge.BackColor = SystemColors.Control;
                    txtAge.BackColor = SystemColors.Control;
                    lblAge.BackColor = SystemColors.Control;
                    pnlMobile.BackColor = SystemColors.Control;
                    txtMobile.BackColor = SystemColors.Control;
                    lblMobile.BackColor = SystemColors.Control;
                    pnlPlan.BackColor = SystemColors.Control;
                    cboUSCallPlan.BackColor = SystemColors.Control;
                    lblPlan.BackColor = SystemColors.Control;
                    lblGender.BackColor = Color.White;
                    pnlGender.BackColor = Color.White;
                }
            }
            private void txtMobile_KeyPress(object sender, KeyPressEventArgs e)
            {
                if (!char.IsControl(e.KeyChar) && !char.IsDigit(e.KeyChar) && (e.KeyChar == '.'))
                {
                    e.Handled = true;
                }
                if(e.KeyChar == (char)13)
                {
                    cboUSCallPlan.Focus();
                    txtName.BackColor = SystemColors.Control;
                    pnlName.BackColor = SystemColors.Control;
                    lblName.BackColor = SystemColors.Control;
                    pnlID.BackColor = SystemColors.Control;
                    txtID.BackColor = SystemColors.Control;
                    lblID.BackColor = SystemColors.Control;
                    pnlPassword.BackColor = SystemColors.Control;
                    txtPassword.BackColor = SystemColors.Control;
                    lblPassword.BackColor = SystemColors.Control;
                    pnlAge.BackColor = SystemColors.Control;
                    txtAge.BackColor = SystemColors.Control;
                    lblAge.BackColor = SystemColors.Control;
                    pnlMobile.BackColor = SystemColors.Control;
                    txtMobile.BackColor = SystemColors.Control;
                    lblMobile.BackColor = SystemColors.Control;
                    pnlPlan.BackColor = Color.White;
                    cboUSCallPlan.BackColor = Color.White;
                    lblPlan.BackColor = SystemColors.Control;
                    lblGender.BackColor = SystemColors.Control;
                    pnlGender.BackColor = SystemColors.Control;
                }
            }

    마지막 if문은 디자인 부분이므로 무시해도 상관없다. Age텍스트박스에 숫자 외에 제약을 두기 위한 부분이다. 키 프레스 이벤트인 e가 제어문자가 아니어야하고, 알파벳이나 한글도 아니어야하고 ' . '도 아니어야 텍스트가 입력된다. 그 밑의 모바일 부분도 마찬가지이다 숫자만 입력가능하게 했다.

     

    private void btnID_Click(object sender, EventArgs e)
            {
                Checking();
            }
    
            private void Checking()
            {
                using (SqlConnection conn = new SqlConnection(Commons.CONNSTRING))
                {
                    conn.Open();
                    string strQuery = "SELECT userID FROM userTbl WHERE userID=@userID ";
                    SqlCommand command = new SqlCommand(strQuery, conn);
                    string temp = "";
    
                    SqlParameter paramUserID = new SqlParameter("@userID", SqlDbType.VarChar, 50);
                    paramUserID.Value = txtID.Text;
                    command.Parameters.Add(paramUserID);
    
                    using (SqlDataReader reader = command.ExecuteReader())
                    {
                        if (reader.HasRows)
                        {
    
                            MetroMessageBox.Show(this,"이미 사용중인 아이디입니다.\n아이디를 확인해 주세요", "경고", MessageBoxButtons.OK, MessageBoxIcon.Error);
                            txtID.Clear();
                            txtID.Focus();
                            return;
                        }
                        else if(string.IsNullOrEmpty(txtID.Text))
                        {
                            MetroMessageBox.Show(this,"아이디가 입력되지 않았습니다.", "경고", MessageBoxButtons.OK, MessageBoxIcon.Error);
                            txtID.Clear();
                            txtID.Focus();
                            return;
                        }
                        else
                        {
                            overlapcheck = true;
                            MetroMessageBox.Show(this,"사용 가능한 아이디입니다.", "완료", MessageBoxButtons.OK, MessageBoxIcon.Information);
                            return;
                        }
                    }
    
                }
            }

    아이디의 중복

    'C# 예제 공부일기' 카테고리의 다른 글

    WinForm 콤보박스를 이용한 학점계산기  (2) 2020.08.11
    MES 1일  (0) 2020.08.10
    미니프로젝트 정리 (조원파트) Login Form  (0) 2020.07.31
    Thread  (0) 2020.07.31
    소켓 프로그래밍 (네트워크) #3  (0) 2020.07.31
Designed by Tistory.