본문으로 바로가기
반응형

어제하던 로그인 예제 이어서 시작)

 

메인폼의 속성창에서

- IsMidContainer를 True로 바꿔준다

- WindowState를 Maximize로 바꿔준다

 

 

메인폼에서 정보관리를위한 메뉴창을 만들어보자

메인폼에 메인메뉴를 생성하고 Names의 이름을 수정해준다

 

 

테이블 윈폼창을 위해 DivForm 이름을 가지는 새 항목을 만들어주자

솔루션 탐색기에서 BookRentalShop20 프로젝트에 우클릭 -> 새 항목 추가를 클릭해서 새 폼을 만들어준다

 

 

화면을 나누는 SplitConatiner를 실행(가운데 선으로 두 패널의 크기를 조절할 수 있다)
왼쪽 속성창에서 splitContainer1를 지정하고 재생버튼을 클릭

 

 

도구에서 DataGridView(저는 Metro UI에서 제공하는 Grid를 사용했습니다) 생성, 부모 컨테이너와 도킹 오른쪽은 속성 창에서 도킹하는 모습

 

라벨과 텍스트 박스, 버튼을 추가하자.(metro UI를 다운받아서 이름도 merto가 붙어있다)(좌), 각 이름과 Text를 바꾼모습(우)
그리드 Names를 GrdDivTbl로 수정
그리드 창에서 재생버튼을 눌러서 데이터 소스를 추가해보자
div의 테이블을 클릭해주고 오른쪽의 그리드 작업의 체크를 해제해준다

 

admin으로 로그인해서 구분코드를 실행하면 해당 테이블이 출력된다

 

 

 

 

 

위에서 클릭으로했던 테이블 출력을 코드로 테이블을 출력해보자

using MetroFramework.Forms;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.SqlClient;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace BookRentalShop20
{
    public partial class DivForm : MetroForm
    {
    	// SSMS에서 로그인하면서 연동하는 코드
        string strConnString = "Data Source=192.168.0.124;Initial Catalog=BookRentalShopDB;Persist Security Info=True;User ID=sa;Password=p@ssw0rd!";
        string mode = "";

        public DivForm()
        {
            InitializeComponent();
        }

        private void DivForm_Load(object sender, EventArgs e)
        {
            UpdateData();   // 데이터그리드 DB 데이터 로딩하기

        }

        private void UpdateData()
        {
            using(SqlConnection conn = new SqlConnection(strConnString))
            {
                conn.Open(); // DB 열기
                string strQuery = "SELECT Division ,Names FROM dbo.divtbl";  // SSMS에서 복사해서 넣기
                SqlCommand cmd = new SqlCommand(strQuery, conn);
                SqlDataAdapter dataAdapter = new SqlDataAdapter(strQuery, conn);
                DataSet ds = new DataSet();
                dataAdapter.Fill(ds, "divtbl");

                GrdDivTbl.DataSource = ds;
                GrdDivTbl.DataMember = "divtbl";
            }
        }
    }
}

위에 클릭으로 테이블을 생성했던 윈폼실행창과 똑같이 출력된다

 

 

 

 

 

 

지금까지 윈폼과 SSMS를 연동해서테이블을 출력하는 것을 해보았는데, 이제 버튼을 클릭했을때 발생하는 이벤트를 구현해보자

 

 

 

삭제, 신규, 저장, 취소 버튼을 클릭하면 발생하는 이벤트 메서드를 작성해보자.

우선 전체 코드이다.

using MetroFramework;
using MetroFramework.Forms;
using System;
using System.Data;
using System.Data.SqlClient;
using System.Drawing;
using System.Windows.Forms;

namespace BookRentalShop20
{
    public partial class UserForm : MetroForm
    {
        string strConnString = "Data Source=192.168.0.124;Initial Catalog=BookRentalShopDB;Persist Security Info=True;User ID=sa;Password=p@ssw0rd!";
        string mode = "";

        public UserForm()
        {
            InitializeComponent();
        }

        private void DivForm_Load(object sender, EventArgs e)
        {
            UpdateData();   // 데이터그리드 DB 데이터 로딩하기
        }

        private void GrdDivTbl_CellClick(object sender, DataGridViewCellEventArgs e)
        {
            if (e.RowIndex > -1)     // 첫번째 인덱스가 0이니까 -1로해준다
            {
                DataGridViewRow data = GrdUserTbl.Rows[e.RowIndex];
                TxtId.Text = data.Cells[0].Value.ToString();
                TxtUserID.Text = data.Cells[1].Value.ToString();  
                TxtPassword.Text = data.Cells[2].Value.ToString();

                mode = "UPDATE";  // 수정은 UPDATE
            }
        }

        // 신규 버튼 클릭 이벤트
        private void BtnNew_Click(object sender, EventArgs e)
        {
            ClearTextControls();
            mode = "INSERT";   // 신규는 INSERT
        }

        // 저장 버튼 클릭 이벤트
        private void BtnSave_Click(object sender, EventArgs e)
        {
            if(String.IsNullOrEmpty(TxtUserID.Text) || string.IsNullOrEmpty(TxtPassword.Text))
            {
                MetroMessageBox.Show(this, "빈 값은 저장할 수 없습니다", "경고",
                   MessageBoxButtons.OK, MessageBoxIcon.Warning);
                return;
            }
            SaveProcess();
            UpdateData();
            ClearTextControls();  
        }
        

        // 저장 버튼의 메서드
        private void SaveProcess()
        {
            if (String.IsNullOrEmpty(mode)) // 아무것도 입력안했을때 오류메세지
            {
                MetroMessageBox.Show(this, "신규버튼을 누르고 데이터를 저장하십시오", "경고",
                    MessageBoxButtons.OK, MessageBoxIcon.Warning);
                return;
            }

            //DB저장 프로세스
            using (SqlConnection conn = new SqlConnection(strConnString))
            {
                conn.Open();
                SqlCommand cmd = new SqlCommand();
                cmd.Connection = conn;
                string strQuery = "";

                if (mode == "UPDATE")
                {
                    strQuery = "UPDATE dbo.userTbl " +
                               "SET userID = @userID, " +
                               " password = @password " +
                               " WHERE Id = @Id";
                }
                else if (mode == "INSERT")
                {
                    strQuery = "INSERT INTO dbo.userTbl( userID, password) " +
                               " VALUES(@userID, @password) ";
                }
                cmd.CommandText = strQuery;

                SqlParameter parmUserID = new SqlParameter("@userID", SqlDbType.VarChar, 12);
                parmUserID.Value = TxtUserID.Text;
                cmd.Parameters.Add(parmUserID);

                SqlParameter parmPassword = new SqlParameter("@password", SqlDbType.VarChar, 20);
                parmPassword.Value = TxtPassword.Text;
                cmd.Parameters.Add(parmPassword);

                if (mode == "UPDATE")  // 인서트할때는 ID가 필요없으므로 UPDATE문에만 걸리게 설정
                {
                    SqlParameter parmId = new SqlParameter("@Id", SqlDbType.Int);
                    parmId.Value = TxtId.Text;
                    cmd.Parameters.Add(parmId);
                }

                cmd.ExecuteNonQuery(); // 쿼리값을 돌려받지 않으니까 ExecuteNonQuery을 써준다
            }
        }

        // 삭제 버튼 클릭 이벤트
        private void BtnDelete_Click(object sender, EventArgs e)
        {
          
        }

        // 삭제 메서드
        private void DeleteProcess()
        {
            using (SqlConnection conn = new SqlConnection(strConnString))
            {
                conn.Open();
                SqlCommand cmd = new SqlCommand();
                cmd.Connection = conn;
                cmd.CommandText = "DELETE FROM dbo.divtbl WHERE Division = @Division ";
                SqlParameter parmDivision = new SqlParameter("@Division", SqlDbType.Char, 4);
                parmDivision.Value = TxtUserID.Text;
                cmd.Parameters.Add(parmDivision);

                cmd.ExecuteNonQuery();
            }
        }

        private void ClearTextControls()  // 중복된 코드를 메서드로 묶어주기
        {
            TxtId.Text = TxtUserID.Text = TxtPassword.Text = "";
            //TxtUserID.ReadOnly = false;
            //TxtUserID.BackColor = Color.White;
            TxtUserID.Focus();
        }


        // 사용자 데이터 가져오기
        private void UpdateData()
        {
            using (SqlConnection conn = new SqlConnection(strConnString))
            {
                conn.Open(); // DB 열기
                string strQuery = "SELECT id, userID, password, lastLoginDt, loginIpAddr" +
                                  "  FROM dbo.userTbl";  
                SqlCommand cmd = new SqlCommand(strQuery, conn);
                SqlDataAdapter dataAdapter = new SqlDataAdapter(strQuery, conn);
                DataSet ds = new DataSet();
                dataAdapter.Fill(ds, "userTbl");

                GrdUserTbl.DataSource = ds;
                GrdUserTbl.DataMember = "userTbl";
            }
            DataGridViewColumn column = GrdUserTbl.Columns[0]; // id컬럼
            column.Width = 40;
            column.HeaderText = "순번";
            column = GrdUserTbl.Columns[1];  // userID 컬럼
            column.Width = 80;
            column.HeaderText = "아이디";
            column = GrdUserTbl.Columns[2];  // Password 컬럼
            column.Width = 100;
            column.HeaderText = "패스워드";
            column = GrdUserTbl.Columns[3];  // 최종접속 시간 컬럼
            column.Width = 120;
            column.HeaderText = "최종접속시간";
            column = GrdUserTbl.Columns[4];  // 접속IP주소 컬럼
            column.Width = 150;
            column.HeaderText = "접속IP주소";
        }
    }
}

 중간중간에 strQuery가 보이는 것을 확인할 수 있는데, 밑의 이미지대로 SSMS에서 쿼리문을 작성한 것이다.

값을 수정할때 저장버튼을 누를때 발생하는 이벤트 SSMS 쿼리문
신규 버튼 클릭 이벤트 메서드의 SSMS 쿼리문
Delete 버튼 클릭 이벤트 메서드 SSMS 쿼리문

 

 

 

 

 

 

 

 

 위의 과정은 메인폼으로 관리자 메뉴에서 테이블의 데이터를 관리하는 코드를 짜보았다.

 이번엔 DivForm 프로젝트파일을 그대로 복사해서 UserForm으로 이름을 붙여주고, 코드창의 DivForm을 전부 UserForm으로 바꿔준다

cs파일에서 클랙스 DivForm을 UserForm으로 변경했다

 

 

userTbl 쿼리창을 연다음에, 쿼리창의 코드를 복사한다.

 

 

 

Div폼 코드

using MetroFramework;
using MetroFramework.Forms;
using System;
using System.Data;
using System.Data.SqlClient;
using System.Drawing;
using System.Windows.Forms;

namespace BookRentalShop20
{
    public partial class DivForm : MetroForm
    {
        string strConnString = "Data Source=192.168.0.124;Initial Catalog=BookRentalShopDB;Persist Security Info=True;User ID=sa;Password=p@ssw0rd!";
        string mode = "";

        public DivForm()
        {
            InitializeComponent();
        }

        private void DivForm_Load(object sender, EventArgs e)
        {
            UpdateData();   // 데이터그리드 DB 데이터 로딩하기

        }

        private void GrdDivTbl_CellClick(object sender, DataGridViewCellEventArgs e)
        {
            if (e.RowIndex > -1)     // 첫번째 인덱스가 0이니까 -1로해준다
            {
                DataGridViewRow data = GrdDivTbl.Rows[e.RowIndex];
                TxtDivision.Text = data.Cells[0].Value.ToString();  // object는 Tostring을 때려주자
                TxtNames.Text = data.Cells[1].Value.ToString();
                // 구분 코드는 SSMS에서 기본키로 지정되어있기때문에 수정할 수 없고 이름은 수정할 수 있다
                TxtDivision.ReadOnly = true;
                TxtDivision.BackColor = Color.Beige;

                mode = "UPDATE";  // 수정은 UPDATE
            }
        }

        // 신규 버튼 클릭 이벤트
        private void BtnNew_Click(object sender, EventArgs e)
        {
            ClearTextControls();
            mode = "INSERT";   // 신규는 INSERT
        }

        // 저장 버튼 클릭 이벤트
        private void BtnSave_Click(object sender, EventArgs e)
        {
            if(String.IsNullOrEmpty(TxtDivision.Text) || string.IsNullOrEmpty(TxtNames.Text))
            {
                MetroMessageBox.Show(this, "빈 값은 저장할 수 없습니다", "경고",
                   MessageBoxButtons.OK, MessageBoxIcon.Warning);
                return;
            }
            SaveProcess();
            UpdateData();
            ClearTextControls();  
        }

        

        // 저장 버튼의 메서드
        private void SaveProcess()
        {
            if (String.IsNullOrEmpty(mode)) // 아무것도 입력안했을때 오류메세지
            {
                MetroMessageBox.Show(this, "신규버튼을 누르고 데이터를 저장하십시오", "경고",
                    MessageBoxButtons.OK, MessageBoxIcon.Warning);
                return;
            }

            //DB저장 프로세스
            using (SqlConnection conn = new SqlConnection(strConnString))
            {
                conn.Open();
                SqlCommand cmd = new SqlCommand();
                cmd.Connection = conn;
                string strQuery = "";

                if (mode == "UPDATE")
                {
                    strQuery = "UPDATE dbo.divtbl" +
                               "   SET Names = @Names " +
                               "WHERE Division = @Division";     // SQL문에서 복사해오기
                   
                }
                else if (mode == "INSERT")
                {
                    strQuery = "INSERT INTO dbo.divtbl (Division, Names) " +
                               "VALUES (@Division, @Names)";
                }
                cmd.CommandText = strQuery;


                SqlParameter parmNames = new SqlParameter("@Names", SqlDbType.NVarChar, 45);
                parmNames.Value = TxtNames.Text;
                cmd.Parameters.Add(parmNames);

                SqlParameter parmDivision = new SqlParameter("@Division", SqlDbType.Char, 4);
                parmDivision.Value = TxtDivision.Text;
                cmd.Parameters.Add(parmDivision);

                cmd.ExecuteNonQuery(); // 쿼리값을 돌려받지 않으니까 ExecuteNonQuery을 써준다
            }
        }

        // 삭제 버튼 클릭 이벤트
        private void BtnDelete_Click(object sender, EventArgs e)
        {
            if (String.IsNullOrEmpty(TxtDivision.Text) || string.IsNullOrEmpty(TxtNames.Text))
            {
                MetroMessageBox.Show(this, "빈 값은 삭제할 수 없습니다", "경고",
                   MessageBoxButtons.OK, MessageBoxIcon.Warning);
                return;
            }

            DeleteProcess();
            UpdateData();
            ClearTextControls();
        }


        // 삭제 메서드
        private void DeleteProcess()
        {
            using (SqlConnection conn = new SqlConnection(strConnString))
            {
                conn.Open();
                SqlCommand cmd = new SqlCommand();
                cmd.Connection = conn;
                cmd.CommandText = "DELETE FROM dbo.divtbl WHERE Division = @Division ";
                SqlParameter parmDivision = new SqlParameter("@Division", SqlDbType.Char, 4);
                parmDivision.Value = TxtDivision.Text;
                cmd.Parameters.Add(parmDivision);

                cmd.ExecuteNonQuery();
            }
        }

        private void ClearTextControls()  // 중복된 코드를 메서드로 묶어주기
        {
            TxtDivision.Text = TxtNames.Text = "";
            TxtDivision.ReadOnly = false;
            TxtDivision.BackColor = Color.White;
            TxtDivision.Focus();
        }



        private void UpdateData()
        {
            using (SqlConnection conn = new SqlConnection(strConnString))
            {
                conn.Open(); // DB 열기
                string strQuery = "SELECT Division ,Names FROM dbo.divtbl";  // SSMS에서 복사해서 넣기
                SqlCommand cmd = new SqlCommand(strQuery, conn);
                SqlDataAdapter dataAdapter = new SqlDataAdapter(strQuery, conn);
                DataSet ds = new DataSet();
                dataAdapter.Fill(ds, "divtbl");

                GrdDivTbl.DataSource = ds;
                GrdDivTbl.DataMember = "divtbl";
            }
        }
        private void TxtNames_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (e.KeyChar == 13)
            {
                BtnSave_Click(sender, new EventArgs());
            }
        }
    }
}

유저폼에서 강의 시간이 끝나서 삭제랑 최종 접속시간, 접속 IP를 구현하지 않았습니다

 

 

 

실행화면을 확인해보자

로그인폼에서 로그인하여 Div폼의 실행을 확인하는 화면

admin으로 로그인한다음 구분코드 관리를 들어가서 SSMS의 테이블을 불러온 것을 확인할 수 있다.

그다음 구분코드를 저장하려고했는데 신규를 누르지않아서 오류가 난것을 메세지로 출력했고,

빈 데이터를 저장하려고하면 저장하지 못하도록 에러코드를 구현했다.

 

신규를 누르고 새 데이터(I002 자기개발)를 입력한 후에 저장을 누르면 그대로 테이블에 저장된 것을 확인할 수 있고,

I002 자기개발 데이터를 클릭해서 이름을 '에세이'로 바꿔서 저장을누르면 수정된 것을 확인할 수 있다.

 

마지막으로 추가한 데이터 'I002 에세이'를 클릭한 후에 삭제를 누르면 값이 삭제되는 것까지 구현했다.

 

 

 

 

UserForm의 실행 화면(admin과 KingDW로 로그인하는 것에 주목해보자) 

우선 admin으로 로그인한다음에 아이디와 패스워드를 입력해서 저장하면 신규를 누른다음에 저장하라는 에러메세지를 구현했고, 신규를 누른다음 저장을 누르면 사용자 관리 테이블에 새로운 데이터가 추가되는 것을 확인할 수 있다.

그리고 프로그램을 종료한다음, KingDW로 로그인이 되는것을 볼 수 있다.

 

 

 

 

 

 

오늘의 추신)

Ctrl + U : 선택한 영역의 글자들을 소문자로 변환

Ctrl + Shift + U : 선택한 영역의 글자들을 대문자로 변환

반응형