ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 미니프로젝트 정리 (조원파트) Login Form
    C# 예제 공부일기 2020. 7. 31. 20:24

     

    사용자가 프로그램을 시작하면 가장 먼저 마주치는 창이다. 못생긴 윈폼에 디자인을 해보려고 발악을 했으나 인공지능반의 화려한 웹페이지보다 많이 초라했다.

    private void btnCancel_Click(object sender, EventArgs e)
    {
    	Environment.Exit(0);
    }
    
    private void btnOK_Click(object sender, EventArgs e)
    {
    	if ((!rdbtnAdmin.Checked && !rdbtnMember.Checked))
    	{
    		MetroMessageBox.Show(this,"관리자/사용자 모드를 선택해 주세요.", "오류", MessageBoxButtons.OK, MessageBoxIcon.Error);
    		return;
    	}
    	LoginProcess();
    }

    가장 먼저 취소 버튼을 눌렀을 때 프로그램이 종료되도록 했고 Ok버튼을 눌렀을 때, 위쪽 체크박스에 관리자, 사용자 둘중에 선택이 안되어있다면 메세지박스를 띄워 밑의 로그인 프로세스가 실행이 되지 않도록 한다.

     

     

    다음은 로그인 절차를 진행하는 메소드이다.

    private void LoginProcess()
            {
                if (string.IsNullOrEmpty(txtID.Text) || string.IsNullOrEmpty(txtPassword.Text))
                {
                    MetroMessageBox.Show(this,"아이디/패스워드를 입력하세요.", "오류", MessageBoxButtons.OK, MessageBoxIcon.Error);               
                    txtID.Focus();
                    return;
                }

    ID텍스트박스와 PW텍스트 박스 둘 중 하나라도 비어있다면 메세지박스를 띄우고 입력을 강제하는 의미로 포커스를 ID에 놓는다.

     

    if (rdbtnMember.Checked)
                { 
                    try
                    {
                        using (SqlConnection conn = new SqlConnection(Commons.CONNSTRING)) 
                        {
                            conn.Open();
                            SqlCommand cmd = new SqlCommand();
                            cmd.Connection = conn;
                            cmd.CommandText = "SELECT userID, userSearch FROM userTbl " +
                                              " WHERE userID = @userID " +
                                                " AND userPassword = @userPassword ";
                            SqlParameter paramUserID = new SqlParameter("@userID", SqlDbType.VarChar, 50);
                            paramUserID.Value = txtID.Text;
                            cmd.Parameters.Add(paramUserID);
    
                            SqlParameter paramUserPassword = new SqlParameter("@userPassword", SqlDbType.VarChar, 50);
                            paramUserPassword.Value = txtPassword.Text;
                            cmd.Parameters.Add(paramUserPassword);
    
                            SqlDataReader reader = cmd.ExecuteReader();
                            reader.Read();
                            string struserID = reader["userID"] != null ? reader["userID"].ToString() : "";
    
    
                            if (struserID != "")
                            {
                                MetroMessageBox.Show(this,"접속성공", "로그인성공", MessageBoxButtons.OK, MessageBoxIcon.Information);
                                Commons.LOGINUSERID = struserID;
                                this.Close();
                            }
                            else
                            {
                                MetroMessageBox.Show(this,"접속실패", "로그인실패", MessageBoxButtons.OK, MessageBoxIcon.Error);
                                return;
                            }
    
                        }
                    }
                    catch (Exception)
                    {
                        MetroMessageBox.Show(this,"로그인에 실패했습니다.\n아이디/비밀번호를 확인해 주세요.", "오류", MessageBoxButtons.OK, MessageBoxIcon.Error);
                        txtID.Clear();
                        txtPassword.Clear();
                        txtID.Focus();
                    }
                }

    다음은 크게 두가지 조건문으로 구분되는데 사용자 체크박스가 체크된 상태로 로그인 버튼을 누른다면 userTbl에서 

    userID와 userPassword를 Select하는데 조건이 텍스트박스에 입력한 아이디와 비밀번호를 WHERE절에 걸어서 들고온다. 들고온 데이터가 null이 아니라면 삼항연산자에서 Select한 Reader를 통해서 저장해놓은 딕셔너리 형태에서 struserID에 로그인이 성공한 userID를 저장한다. null이라면 일치하는 ID가 없으므로 "" 빈칸을 넣고 struserID에 저장한다. 그 밑의 조건문에서 ""이 아닌 경우 로그인성공 메세지를 띄우고 로그인 창을 닫는다. 하지만 일치하는 ID와 PWD가 없다면 로그인 실패메세지를 띄우고 로그인창을 유지한다. 여기서 발생할 수 있는 에러는 전부 catch문 안에 넣어놓고 로그인 실패 메세지와 함께 텍스트박스를 전부 비운다.

     

                if(rdbtnAdmin.Checked)
                {
                    try
                    {
                        using (SqlConnection conn = new SqlConnection(Commons.CONNSTRING)) //commons.cs 로 만들었어요
                        {
                            conn.Open();
                            SqlCommand cmd = new SqlCommand();
                            cmd.Connection = conn;
                            cmd.CommandText = "SELECT masterID FROM masterTbl " +
                                              " WHERE masterID = @masterID " +
                                                " AND masterPassword = @masterPassword ";
                            SqlParameter paramMasterID = new SqlParameter("@masterID", SqlDbType.VarChar, 50);
                            paramMasterID.Value = txtID.Text;
                            cmd.Parameters.Add(paramMasterID);
    
                            SqlParameter paramPassword = new SqlParameter("@masterPassword", SqlDbType.VarChar, 50);
                            paramPassword.Value = txtPassword.Text;
                            cmd.Parameters.Add(paramPassword);
    
                            SqlDataReader reader = cmd.ExecuteReader();
                            reader.Read();
                            string strMasterID = reader["masterID"] !=null? reader["masterID"].ToString():"";
    
                            if(strMasterID !="")
                            {
                                MetroMessageBox.Show(this,"접속성공", "로그인성공", MessageBoxButtons.OK, MessageBoxIcon.Information);
                                //HJ 수정 [20200703 16:40] : form.showDialog()를 하게 되면 Login창이 꺼지지 않음, 코드 위치 수정
                                //HJ 추가 [20200703 20:55] : Program.cs에 미리 창을 만들어 놓음으로서 Login창이 꺼지더라도 관리자 창이 안꺼지도록 수정
                                Commons.LOGINUSERID = strMasterID;
                                //AdministrationForm form = new AdministrationForm();
                                //form.Show();
                                this.Close();
                            }
                            else
                            {
                                MetroMessageBox.Show(this,"접속실패", "로그인실패", MessageBoxButtons.OK, MessageBoxIcon.Error);
                                return;
                            }
                        }
                    }
                    catch(Exception)
                    {
                        MetroMessageBox.Show(this,"로그인에 실패했습니다.\n아이디 / 비밀번호를 확인해 주세요.", "오류", MessageBoxButtons.OK, MessageBoxIcon.Error);
                        txtID.Clear();
                        txtPassword.Clear();
                        txtID.Focus ();
                    }
                    
                }
    
            }

    다음은 라디오버튼에서 관리자 버튼이 눌린채로 로그인을 할 때 발생하는 경우이다. 여기서는 관리자 테이블을 참조해서 아이디와 비밀번호를 비교한다.

    프로젝트에서 masterTbl에서는 한가지 아이디와 비밀번호밖에 생성하지 않았다. 위에서 사용자가 로그인 했던 방법과 마찬가지로 masterTbl에서 쿼리문으로 관리자 아이디와 비밀번호를 WHERE절 조건으로 해서 SELECT 한후 null이 아니라면 접속 성공으로 간주하고 null이 맞다면 로그인 실패 메세지와 함께 로그인 창에 머문다.

     

    여기서 로그인 창이 닫히고 본격적으로 사용자 창과 관리자 창 두가지로 나뉘게 되는데 그 부분은 Program.cs에 있다.

    이 프로그램의 주 진입점으로 여기서 가장 먼저 로그인창을 부르고 Commons에 저장되어 있는 LOGINUSERID를 기준으로 "admin"으로 로그인이 됬다면 관리자 창을 띄우고 그 외의 경우엔 사용자 창을 띄운다.

    using System;
    using System.Windows.Forms;
    
    namespace MiniProject
    {
        static class Program
        {
            /// <summary>
            /// 해당 애플리케이션의 주 진입점입니다.
            /// </summary>
            [STAThread]
            static void Main()
            {
                Application.EnableVisualStyles();
                Application.SetCompatibleTextRenderingDefault(false);
    
                Application.Run(new LoginForm());
                
                if (Commons.LOGINUSERID == "admin")
                {
                    AdministrationForm fr = new AdministrationForm();
                    Application.Run(fr);
                    fr.ShowInTaskbar = true;
                }
                else
                {
                    ProductForm pf = new ProductForm();
                    Application.Run(pf);
                    pf.ShowInTaskbar = true;
                }
            }
        }
    }
    

     

     

    로그인창의 프로세스는 여기까지이고 여기서 밑의 부분은 디자인에 관한 부분이다. text가 클릭 될경우 색깔이 변하도록 했다. btnNew_Click에서는 로그인 창을 그대로 띄워놓은 상태로 회원가입 창을 띄우는 부분이다.

    private void txtPassword_KeyPress(object sender, KeyPressEventArgs e)
            {
                if(e.KeyChar==(char)13)
                {
                   btnOK.Focus();
                    txtID.BackColor = SystemColors.Control;
                    panel4.BackColor = SystemColors.Control;
                    txtPassword.BackColor = SystemColors.Control;
                    panel7.BackColor = SystemColors.Control;
                }
            }
    
            private void rdbtnMember_MouseClick(object sender, MouseEventArgs e)
            {
                btnOK.Focus();
            }
    
            private void btnNew_Click(object sender, EventArgs e)
            {
                NewMemberForm form = new NewMemberForm();
                form.ShowDialog();
            }
    
            private void txtID_TextChanged(object sender, EventArgs e)
            {
                txtID.BackColor = Color.White;
                panel4.BackColor = SystemColors.Window;
                txtPassword.BackColor = SystemColors.Control;
                panel7.BackColor = SystemColors.Control;
            }
    
            private void txtPassword_TextChanged(object sender, EventArgs e)
            {
                txtID.BackColor = SystemColors.Control;
                panel4.BackColor = SystemColors.Control;
                txtPassword.BackColor = Color.White;
                panel7.BackColor = SystemColors.Window;
            }
    
            private void panel4_Click(object sender, EventArgs e)
            {
                txtID.BackColor = Color.White;
                panel4.BackColor = SystemColors.Window;
                txtPassword.BackColor = SystemColors.Control;
                panel7.BackColor = SystemColors.Control;
            }
    
            private void panel7_Click(object sender, EventArgs e)
            {
                txtPassword.BackColor = Color.White;
                panel7.BackColor = SystemColors.Window;
                txtID.BackColor = SystemColors.Control;
                panel4.BackColor = SystemColors.Control;
            }
    
            private void txtID_Click(object sender, EventArgs e)
            {
                txtID.BackColor = Color.White;
                panel4.BackColor = SystemColors.Window;
                txtPassword.BackColor = SystemColors.Control;
                panel7.BackColor = SystemColors.Control;
            }
    
            private void txtPassword_Click(object sender, EventArgs e)
            {
                txtPassword.BackColor = Color.White;
                panel7.BackColor = SystemColors.Window;
                txtID.BackColor = SystemColors.Control;
                panel4.BackColor = SystemColors.Control;
            }
    
            private void rdbtnAdmin_CheckedChanged(object sender, EventArgs e)
            {
                txtID.BackColor = Color.White;
                panel4.BackColor = SystemColors.Window;
                txtPassword.BackColor = SystemColors.Control;
                panel7.BackColor = SystemColors.Control;
            }
    
            private void rdbtnMember_CheckedChanged(object sender, EventArgs e)
            {
                txtID.BackColor = Color.White;
                panel4.BackColor = SystemColors.Window;
                txtPassword.BackColor = SystemColors.Control;
                panel7.BackColor = SystemColors.Control;
            }
        }

     

     

    이 밑에는 전체 소스코드와 실행 영상이다.

     

    using MetroFramework;
    using System;
    using System.Data;
    using System.Data.SqlClient;
    using System.Drawing;
    using System.Windows.Forms;
    
    namespace MiniProject
    {
        public partial class LoginForm : Form
        {
            public LoginForm()
            {
                InitializeComponent(); 
            }
    
            private void btnCancel_Click(object sender, EventArgs e)
            {
                Environment.Exit(0);
            }
    
            private void btnOK_Click(object sender, EventArgs e)
            {
                if ((!rdbtnAdmin.Checked && !rdbtnMember.Checked))
                {
                    MetroMessageBox.Show(this,"관리자/사용자 모드를 선택해 주세요.", "오류", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    return;
                }
                LoginProcess();
            }
    
            private void LoginProcess()
            {
                if (string.IsNullOrEmpty(txtID.Text) || string.IsNullOrEmpty(txtPassword.Text))
                {
                    MetroMessageBox.Show(this,"아이디/패스워드를 입력하세요.", "오류", MessageBoxButtons.OK, MessageBoxIcon.Error);               
                    txtID.Focus();
                    return;
                }
    
                if (rdbtnMember.Checked)
                { 
                    try
                    {
                        using (SqlConnection conn = new SqlConnection(Commons.CONNSTRING)) 
                        {
                            conn.Open();
                            SqlCommand cmd = new SqlCommand();
                            cmd.Connection = conn;
                            cmd.CommandText = "SELECT userID, userSearch FROM userTbl " +
                                              " WHERE userID = @userID " +
                                                " AND userPassword = @userPassword ";
                            SqlParameter paramUserID = new SqlParameter("@userID", SqlDbType.VarChar, 50);
                            paramUserID.Value = txtID.Text;
                            cmd.Parameters.Add(paramUserID);
    
                            SqlParameter paramUserPassword = new SqlParameter("@userPassword", SqlDbType.VarChar, 50);
                            paramUserPassword.Value = txtPassword.Text;
                            cmd.Parameters.Add(paramUserPassword);
    
                            SqlDataReader reader = cmd.ExecuteReader();
                            reader.Read();
                            string struserID = reader["userID"] != null ? reader["userID"].ToString() : "";
    
    
                            if (struserID != "")
                            {
                                MetroMessageBox.Show(this,"접속성공", "로그인성공", MessageBoxButtons.OK, MessageBoxIcon.Information);
                                Commons.LOGINUSERID = struserID;
                                this.Close();
                            }
                            else
                            {
                                MetroMessageBox.Show(this,"접속실패", "로그인실패", MessageBoxButtons.OK, MessageBoxIcon.Error);
                                return;
                            }
    
                        }
                    }
                    catch (Exception)
                    {
                        MetroMessageBox.Show(this,"로그인에 실패했습니다.\n아이디/비밀번호를 확인해 주세요.", "오류", MessageBoxButtons.OK, MessageBoxIcon.Error);
                        txtID.Clear();
                        txtPassword.Clear();
                        txtID.Focus();
                    }
                }
    
                if(rdbtnAdmin.Checked)
                {
                    try
                    {
                        using (SqlConnection conn = new SqlConnection(Commons.CONNSTRING)) //commons.cs 로 만들었어요
                        {
                            conn.Open();
                            SqlCommand cmd = new SqlCommand();
                            cmd.Connection = conn;
                            cmd.CommandText = "SELECT masterID FROM masterTbl " +
                                              " WHERE masterID = @masterID " +
                                                " AND masterPassword = @masterPassword ";
                            SqlParameter paramMasterID = new SqlParameter("@masterID", SqlDbType.VarChar, 50);
                            paramMasterID.Value = txtID.Text;
                            cmd.Parameters.Add(paramMasterID);
    
                            SqlParameter paramPassword = new SqlParameter("@masterPassword", SqlDbType.VarChar, 50);
                            paramPassword.Value = txtPassword.Text;
                            cmd.Parameters.Add(paramPassword);
    
                            SqlDataReader reader = cmd.ExecuteReader();
                            reader.Read();
                            string strMasterID = reader["masterID"] !=null? reader["masterID"].ToString():"";
    
                            if(strMasterID !="")
                            {
                                MetroMessageBox.Show(this,"접속성공", "로그인성공", MessageBoxButtons.OK, MessageBoxIcon.Information);
                                //HJ 수정 [20200703 16:40] : form.showDialog()를 하게 되면 Login창이 꺼지지 않음, 코드 위치 수정
                                //HJ 추가 [20200703 20:55] : Program.cs에 미리 창을 만들어 놓음으로서 Login창이 꺼지더라도 관리자 창이 안꺼지도록 수정
                                Commons.LOGINUSERID = strMasterID;
                                //AdministrationForm form = new AdministrationForm();
                                //form.Show();
                                this.Close();
                            }
                            else
                            {
                                MetroMessageBox.Show(this,"접속실패", "로그인실패", MessageBoxButtons.OK, MessageBoxIcon.Error);
                                return;
                            }
                        }
                    }
                    catch(Exception)
                    {
                        MetroMessageBox.Show(this,"로그인에 실패했습니다.\n아이디 / 비밀번호를 확인해 주세요.", "오류", MessageBoxButtons.OK, MessageBoxIcon.Error);
                        txtID.Clear();
                        txtPassword.Clear();
                        txtID.Focus ();
                    }
                    
                }
    
            }
           
            private void txtID_KeyPress(object sender, KeyPressEventArgs e)
            {
                if(e.KeyChar==(char)13)
                {
                    txtPassword.Focus();
            
                    txtID.BackColor = SystemColors.Control;
                    panel4.BackColor = SystemColors.Control;
                    txtPassword.BackColor = Color.White;
                    panel7.BackColor = SystemColors.Window;
                }
                if (e.KeyChar == (char)9)
                {
                    
    
                }
            }
    
            private void txtPassword_KeyPress(object sender, KeyPressEventArgs e)
            {
                if(e.KeyChar==(char)13)
                {
                   btnOK.Focus();
                    txtID.BackColor = SystemColors.Control;
                    panel4.BackColor = SystemColors.Control;
                    txtPassword.BackColor = SystemColors.Control;
                    panel7.BackColor = SystemColors.Control;
                }
            }
    
            private void rdbtnMember_MouseClick(object sender, MouseEventArgs e)
            {
                btnOK.Focus();
            }
    
            private void btnNew_Click(object sender, EventArgs e)
            {
                NewMemberForm form = new NewMemberForm();
                form.ShowDialog();
            }
    
            private void txtID_TextChanged(object sender, EventArgs e)
            {
                txtID.BackColor = Color.White;
                panel4.BackColor = SystemColors.Window;
                txtPassword.BackColor = SystemColors.Control;
                panel7.BackColor = SystemColors.Control;
            }
    
            private void txtPassword_TextChanged(object sender, EventArgs e)
            {
                txtID.BackColor = SystemColors.Control;
                panel4.BackColor = SystemColors.Control;
                txtPassword.BackColor = Color.White;
                panel7.BackColor = SystemColors.Window;
            }
    
            private void panel4_Click(object sender, EventArgs e)
            {
                txtID.BackColor = Color.White;
                panel4.BackColor = SystemColors.Window;
                txtPassword.BackColor = SystemColors.Control;
                panel7.BackColor = SystemColors.Control;
            }
    
            private void panel7_Click(object sender, EventArgs e)
            {
                txtPassword.BackColor = Color.White;
                panel7.BackColor = SystemColors.Window;
                txtID.BackColor = SystemColors.Control;
                panel4.BackColor = SystemColors.Control;
            }
    
            private void txtID_Click(object sender, EventArgs e)
            {
                txtID.BackColor = Color.White;
                panel4.BackColor = SystemColors.Window;
                txtPassword.BackColor = SystemColors.Control;
                panel7.BackColor = SystemColors.Control;
            }
    
            private void txtPassword_Click(object sender, EventArgs e)
            {
                txtPassword.BackColor = Color.White;
                panel7.BackColor = SystemColors.Window;
                txtID.BackColor = SystemColors.Control;
                panel4.BackColor = SystemColors.Control;
            }
    
            private void rdbtnAdmin_CheckedChanged(object sender, EventArgs e)
            {
                txtID.BackColor = Color.White;
                panel4.BackColor = SystemColors.Window;
                txtPassword.BackColor = SystemColors.Control;
                panel7.BackColor = SystemColors.Control;
            }
    
            private void rdbtnMember_CheckedChanged(object sender, EventArgs e)
            {
                txtID.BackColor = Color.White;
                panel4.BackColor = SystemColors.Window;
                txtPassword.BackColor = SystemColors.Control;
                panel7.BackColor = SystemColors.Control;
            }
        }
    }
    

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

    MES 1일  (0) 2020.08.10
    미니프로젝트 정리 (조원파트) NewMemberForm  (0) 2020.08.08
    Thread  (0) 2020.07.31
    소켓 프로그래밍 (네트워크) #3  (0) 2020.07.31
    외부에서 MariaDB 접속하기  (0) 2020.07.31
Designed by Tistory.