이번 시간은 본격적으로 가계부 입력타임! 가계부에서 제일 중요한 부분이겠죠? ㅎㅎ
입력을 위한 환경 설정, 가계부 내역 입력하기, 내역 수정하기 포스팅 시작해 보겠습니다!
첫 번째. 입력 환경 세팅하기
UI는 위와 같으며, 위의 구분, 계정, 입/출금 구분, 입/출금 기준 4개의 콤보박스에 대해서 각각의 선택에 따라 다음 콤보박스 입력 값이 바뀌도록 코딩했습니다.
아래에서 각각의 SelectedIndexChanged 이벤트에 대해 알아보겠습니다.
[1] 날짜입력 아래에는 DateTimePicker로 날짜를 선택할 수 있도록 했습니다.
[2] 구분(cbUseType)에는 수입/지출/계좌이동을 선택할 수 있는 comboBox를 위치했습니다.
ComboBox Item에 수입, 지출, 계좌이동의 값을 등록하고 선택 값에 따라 다음 콤보박스 값이 바뀌도록 아래와 같이 코딩합니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
private void cbUseType_SelectedIndexChanged(object sender, EventArgs e)
{
cbAccount.Text = "";
cbIEType.Text = "";
cbIEStandard.Text = "";
cbAccount.Items.Clear();
cbIEType.Items.Clear();
if (cbUseType.SelectedIndex == 0) //수입선택
{
cbAccount.Enabled = true;
cbAccount.Items.AddRange(Config.ImportInfo);
cbIEType.Items.AddRange(Config.AccountI);
}
else if (cbUseType.SelectedIndex == 1) //지출선택
{
cbAccount.Enabled = true;
cbAccount.Items.AddRange(Config.ExportInfo);
cbIEType.Items.AddRange(Config.AccountE);
}
else if (cbUseType.SelectedIndex == 2) //계좌이동 선택
{
cbAccount.Enabled = false;
cbIEType.Items.AddRange(Config.AccountName);
cbIEStandard.Items.Clear();
cbIEStandard.Items.AddRange(Config.AccountName);
}
}
|
cs |
구분(cbUseType)에서 선택한 값에 따라 계정(cbAccount) 및 입/출금 구분(cbIEType) 값이 변경됩니다.
- 구분에서 수입을 선택한 경우는 계정에는 본인이 Setting에서 수입 계정(ImportInfo)에 등록한 값이 오고, 입/출금 구분에는 현금, 계좌입금이 나오게 됩니다.
- 구분에서 지출을 선택한 경우는 계정 지출 계정(ExportInfo)에 등록한 값이 오고, 입/출금 구분에는 현금, 체크카드, 신용카드, 타인계좌이체의 Item 이 나오도록 했습니다.
- 계좌이동의 경우에는 수입/지출 계정과는 상관없기 때문에 사용하지 않도록 Enable=False를 해주었으며, 입/출금 기준과 구분에는 본인 계좌정보가 나오도록 했습니다.
아래의 실행 화면을 참고하시면 이해가 빠를 것이라고 생각합니다.
1. 구분 - 수입 선택 -> cbAccount 내용 = 수입 계정, cbIEStandard 내용 = 현금, 계좌입금
2. 구분 - 지출 선택 -> cbAccount 내용 = 지출 계정, cbIEStandard 내용 = 현금, 체크카드, 신용카드, 타인계좌이체
[3] 입/출금 구분(cbIEType)에서는 각각의 입출금유형에 따라 다음 입/출금 기준(cbIEStandard)의 comboBox 내용을 다르게 보이게 했습니다.
- 현금일 경우에는 입출금 기준이 내 지갑으로 나오도록 하였고,
- 체크카드일 경우에는 Setting에서 내가 입력한 체크카드 이름이 나오도록,
- 신용카드일 경우에는 Setting에서 내가 입력한 신용카드 이름이 나오도록,
- 계좌입금(수입), 타인계좌이체(지출)의 경우에는 계좌 이름이 나와서 어느 계좌에서 돈이 빠져나가고 들어오는지를 구분하도록 했습니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
private void cbIEType_SelectedIndexChanged(object sender, EventArgs e)
{
cbIEStandard.Text = "";
if(cbIEType.Text == "현금")
{
cbIEStandard.Items.Clear();
cbIEStandard.Items.AddRange(Config.Cash);
}
else if(cbIEType.Text == "체크카드")
{
cbIEStandard.Items.Clear();
cbIEStandard.Items.AddRange(Config.ConnectCard);
}
else if (cbIEType.Text == "신용카드")
{
cbIEStandard.Items.Clear();
cbIEStandard.Items.AddRange(Config.CardName);
}
else if (cbIEType.Text == "계좌입금" || cbIEType.Text == "타인계좌이체")
{
cbIEStandard.Items.Clear();
cbIEStandard.Items.AddRange(Config.AccountName);
}
}
|
cs |
마찬가지로 아래의 실행 화면을 참고해 주시면 되겠습니다.
1. 입/출금 구분(cbIEType) - 계좌입금, 타인계좌이체 선택 -> 입/출금 기준(cbIEStandard) = 계좌이름
2. 입/출금 구분(cbIEType) - 체크카드 선택 -> 입/출금 기준(cbIEStandard) = 체크카드 이름
3. 입/출금 구분(cbIEType) - 신용카드 선택 -> 입/출금 기준(cbIEStandard) = 신용카드 이름
두 번째. 가계부 내역 불러오기 및 가계부 상세 내역 DataGridView (dvAccountBook) 속성 지정하기
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
public void InitAccountBook()
{
cbUseType.Items.Clear();
cbUseType.Items.AddRange(Config.UseType);
string BookStr = "no as 'No.', use_date as '날짜', use_type as '구분', account as '계정', ie_type as '입출금구분',
ie_standard as '입출금기준', use_cost as '금액', remarks as '상세내역'";
Config.books = _db.SelectDetail(Config.Tables[(int)Config.eTName._book], BookStr);
dvAccountBook.DataSource = Config.books.Tables[0];
bookcnt = Config.books.Tables[0].Rows.Count;
dvAccountBook.Columns[0].AutoSizeMode = DataGridViewAutoSizeColumnMode.None;
dvAccountBook.Columns[0].Width = 40;
dvAccountBook.Columns[0].DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight;
dvAccountBook.Columns[1].DefaultCellStyle.Format = "yyyy-MM-dd";
dvAccountBook.Columns[6].DefaultCellStyle.Format = "###,##0";
dvAccountBook.Columns[6].DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight;
dvAccountBook.Sort(dvAccountBook.Columns[0], ListSortDirection.Descending);
}
|
cs |
가계부 내역은 DB에서 account_book 테이블의 내용을 Select로 가져와서 이 전 시간과 마찬가지로 DataGridView(dvAccountBook)에 DataSource로 등록해 주고, 각 컬럼의 속성을 지정해 주면 됩니다.
그리고, 전역 변수로 bookcnt 값을 선언해주고, 테이블에서 가져온 가계부 내역의 행의 값을 기억해둡니다.
세 번째. 가계부 입력하기
위와 같이 가계부 입력을 위한 환경 설정이 다 끝났으면, 본격적으로 가계부 입력을 하기위해서
입력 버튼(btnSet)의이벤트를 다음과 같이 코딩해줍니다.
가계부 입력은 Insert로 각각의 combobox, textbox 등에서 입력한 값들을 account_book 테이블 데이터베이스에 입력해주기만하면 끝입니다. 입력할 때, no. 값에 위에서 저장해놓은 bookcnt 값을 참고하여 +1 해주어 입력합니다.
마지막으로 썼던 값들을 초기화만 해주면 버튼 이벤트는 간단하게 끝납니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
private void btnSet_Click(object sender, EventArgs e)
{
if (txtUseCost.Text == "") txtUseCost.Text = "0";
string value = $"{bookcnt + 1}, '{txtUseDate.Text}', '{cbUseType.Text}', '{cbAccount.Text}',
'{cbIEType.Text}', '{cbIEStandard.Text}', {Convert.ToInt32(txtUseCost.Text)},'{txtRemarks.Text}'";
_db.Insert(Config.Tables[(int)Config.eTName._book], value);
cbUseType.Text = "";
cbAccount.Enabled = true;
cbAccount.Text = "";
cbIEType.Text = "";
cbIEStandard.Text = "";
txtUseCost.Text = "";
txtRemarks.Text = "";
}
|
cs |
아래에 실행 화면을 첨부했습니다.
네 번째. 가계부 입력값 수정 및 삭제하기
가계부 내역 수정을 위해 fBookUpdate.cs 폼을 하나 생성해줍니다.
폼 안에는 메인의 가계부 입력내역과 동일하게 만들었고,
가계부 내역 목록에서 더블클릭하면 폼이 뜨고, 내역을 수정하도록 했습니다.
fBookUpdate _bookUpdate;
먼저 fMain 에서 fBookUpdate 폼을 선언해줍니다.
그리고 fMain_Load() 함수에서 객체를 생성해줍니다.
_bookUpdate = new fBookUpdate();
그리고, 가계부 내역 목록 DataGridView (dvAccountBook)에서 더블클릭 이벤트를 생성해주고, 클릭 위치의 행의 내용을 폼에 넣어줍니다.
현재 클릭 행의 인덱스를 가져와서 행 값을 참조해야 합니다.
int rowIndex = dvAccountBook.CurrentRow.Index;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
private void dvAccountBook_MouseDoubleClick(object sender, MouseEventArgs e)
{
_bookUpdate = new fBookUpdate(this);
int rowIndex = dvAccountBook.CurrentRow.Index; //클릭한 위치의 rowIndex 받아오기
_bookUpdate.lblNumber.Text = dvAccountBook.Rows[rowIndex].Cells[0].Value.ToString();
_bookUpdate.txtUseDate.Text = dvAccountBook.Rows[rowIndex].Cells[1].Value.ToString();
_bookUpdate.cbUseType.Text = dvAccountBook.Rows[rowIndex].Cells[2].Value.ToString();
_bookUpdate.cbAccount.Text = dvAccountBook.Rows[rowIndex].Cells[3].Value.ToString();
_bookUpdate.cbIEType.Text = dvAccountBook.Rows[rowIndex].Cells[4].Value.ToString();
_bookUpdate.cbIEStandard.Text = dvAccountBook.Rows[rowIndex].Cells[5].Value.ToString();
_bookUpdate.txtUseCost.Text = dvAccountBook.Rows[rowIndex].Cells[6].Value.ToString();
_bookUpdate.txtRemarks.Text = dvAccountBook.Rows[rowIndex].Cells[7].Value.ToString();
_bookUpdate.Show();
}
|
cs |
++ 서브 폼에서 메인 폼 값 변경하기
fBookUpdate 폼에서 값을 수정하고 fMain 폼의 DataGridView의 내용도 같이 업데이트해주기 위해서
폼 객체 생성 시 this 값을 넘겨줘야 합니다.
fBookUpdate _bookUpdate = new fBookUpdate(this);
그냥 메인 폼에서 위와 같이 입력해주면 에러가 발생하는데, this로 객체를 넘겨주기 위해서는 서브 폼에서 다음과 같이 코딩해 줘야 합니다.
1
2
3
4
5
6
7
8
9
10
|
public fBookUpdate()
{
InitializeComponent();
cbUseType.Items.AddRange(Config.UseType);
}
public fBookUpdate(fMain form)
{
InitializeComponent();
_main = form;
}
|
cs |
아래는 더블클릭 화면입니다.
가계부 내역을 더블클릭했을때, 위와 같이 새 창이 뜨고 내역 수정을 할 수 있습니다.
각 ComboBox의 내용은 Main 폼과 동일하게 SelectIndexChanged 이벤트를 등록해주면 됩니다.
수정 완료 버튼과 삭제, 취소 버튼을 만들었는데
[1] 취소 버튼은 단순히 창만 닫기 위해서 버튼 이벤트에 Close(); 함수만 호출해줬습니다.
[2] 수정 완료버튼을 누르면 가계부 내역이 Update 되도록 버튼 이벤트를 다음과 같이 코딩했습니다.
fBookUpdate.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
private void btnUpdate_Click(object sender, EventArgs e)
{
if (txtUseCost.Text == "") txtUseCost.Text = "0";
_main.updateBook(Convert.ToInt32(lblNumber.Text), txtUseDate.Text, cbUseType.Text, cbAccount.Text,
cbIEType.Text, cbIEStandard.Text, Convert.ToInt32(txtUseCost.Text), txtRemarks.Text);
cbUseType.Text = "";
cbAccount.Enabled = true;
cbAccount.Text = "";
cbIEType.Text = "";
cbIEStandard.Text = "";
txtUseCost.Text = "";
txtRemarks.Text = "";
Close();
}
|
cs |
fMain.cs
1
2
3
4
5
6
7
|
public void updateBook(int num, string date, string useType, string account,
string IEtype, string IEstandard, int useCost, string remarks)
{
string value = $"use_date='{date}', use_type='{useType}', account='{account}',
ie_type='{IEtype}', ie_standard='{IEstandard}', use_cost='{useCost}', remarks='{remarks}'";
_db.Update(Config.Tables[(int)Config.eTName._book], value, $"no='{num.ToString()}'");
}
|
cs |
[3] 삭제 버튼은 선택한 행이 삭제되도록 버튼 이벤트를 다음과 같이 선언해주었습니다.
선택한 행 번호를 num로 받아서 DB Delete시 반드시 WHERE 절에 넣어줘야 모든 행이 삭제가 되는 불상사를 막을 수 있습니다.
fBookUpdate.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
private void btnDelete_Click(object sender, EventArgs e)
{
_main.deleteBook(lblNumber.Text);
cbUseType.Text = "";
cbAccount.Enabled = true;
cbAccount.Text = "";
cbIEType.Text = "";
cbIEStandard.Text = "";
txtUseCost.Text = "";
txtRemarks.Text = "";
Close();
}
|
cs |
fMain.cs
1
2
3
4
|
public void deleteBook(string num)
{
_db.DeleteDetail(Config.Tables[(int)Config.eTName._book], "no", num);
}
|
cs |
++ 그리고 폼을 닫을 때 FormClosing 이벤트에서 fMain의 InitAccountBook() 함수를 재 호출해 줍니다.
이는 가계부 상세 내역을 업데이트나 삭제했을 때 가계부 전체 내역의 DataGridView를업데이트 해주기 위해서이며, 메인 폼에서 서브 폼에 this를 꼭 넘겨줘야 제대로 동작이 됩니다.
1
2
3
4
5
|
private void fBookUpdate_FormClosing(object sender, FormClosingEventArgs e)
{
_main.InitAccountBook();
}
|
cs |
후 오늘은 여기까지이며, 가계부 내역 입력과 상세 내역 수정하기에 대해 포스팅해보았습니다.
DB에 값 Insert 하기, 콤보박스 SelectIndexChanged 이벤트 이용하기, 서브 폼에서 메인 폼 제어하기 등을 이용해서 가계부 입력을 해보았구요해보았고요, 댜음 시간에는 가계부 기능에 대한 포스팅으로 돌아오겠습니다.
BYE!
'IT > C#' 카테고리의 다른 글
[Program] Auto Click Program. 매크로 프로그램. (0) | 2020.03.18 |
---|---|
[C#] 가계부 프로그램 만들기 DAY4.수입,지출 등 내역 불러오기 (4) | 2020.03.03 |
[C#] 가계부 프로그램 만들기 DAY2. 프로그램 UI 생성 및 가계부 기본 설정하기 (10) | 2020.02.29 |
[C#] 가계부 프로그램 만들기 DAY1. Database 설정 및 연결 (0) | 2020.02.28 |
[C#] 키 입력에 따른 PictureBox Image 분할창 띄우기 (0) | 2020.01.06 |