어제하던 로그인 예제 이어서 시작)
메인폼의 속성창에서
- IsMidContainer를 True로 바꿔준다
- WindowState를 Maximize로 바꿔준다
메인폼에서 정보관리를위한 메뉴창을 만들어보자
테이블 윈폼창을 위해 DivForm 이름을 가지는 새 항목을 만들어주자
위에서 클릭으로했던 테이블 출력을 코드로 테이블을 출력해보자
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에서 쿼리문을 작성한 것이다.
위의 과정은 메인폼으로 관리자 메뉴에서 테이블의 데이터를 관리하는 코드를 짜보았다.
이번엔 DivForm 프로젝트파일을 그대로 복사해서 UserForm으로 이름을 붙여주고, 코드창의 DivForm을 전부 UserForm으로 바꿔준다
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를 구현하지 않았습니다
실행화면을 확인해보자
admin으로 로그인한다음 구분코드 관리를 들어가서 SSMS의 테이블을 불러온 것을 확인할 수 있다.
그다음 구분코드를 저장하려고했는데 신규를 누르지않아서 오류가 난것을 메세지로 출력했고,
빈 데이터를 저장하려고하면 저장하지 못하도록 에러코드를 구현했다.
신규를 누르고 새 데이터(I002 자기개발)를 입력한 후에 저장을 누르면 그대로 테이블에 저장된 것을 확인할 수 있고,
I002 자기개발 데이터를 클릭해서 이름을 '에세이'로 바꿔서 저장을누르면 수정된 것을 확인할 수 있다.
마지막으로 추가한 데이터 'I002 에세이'를 클릭한 후에 삭제를 누르면 값이 삭제되는 것까지 구현했다.
우선 admin으로 로그인한다음에 아이디와 패스워드를 입력해서 저장하면 신규를 누른다음에 저장하라는 에러메세지를 구현했고, 신규를 누른다음 저장을 누르면 사용자 관리 테이블에 새로운 데이터가 추가되는 것을 확인할 수 있다.
그리고 프로그램을 종료한다음, KingDW로 로그인이 되는것을 볼 수 있다.
오늘의 추신)
Ctrl + U : 선택한 영역의 글자들을 소문자로 변환
Ctrl + Shift + U : 선택한 영역의 글자들을 대문자로 변환
'개발자과정준비 > WinForm' 카테고리의 다른 글
[WinForm] 윈폼과 DB연동 - 북렌탈샵 (0) | 2020.07.14 |
---|---|
[WinForm] 6. 윈폼과 SSMS 연동(3) (0) | 2020.06.23 |
[WinForm] 4. Chart 컨트롤, 윈폼과 SSMS 연동하기 (0) | 2020.06.18 |
[WinForm] 3. 메뉴, 리스트 뷰, 트리뷰, 프로그레스바, 타이머, 그래픽, 도형 구조체, Color 구조체, Pen 클래스 (0) | 2020.06.18 |
[WinForm] 2. 컨트롤, 대화상자, 텍스트박스, 메인 메뉴, 고급 폼 (0) | 2020.06.16 |