IT/C#

[C#] 가계부 프로그램 만들기 DAY3. 가계부 입력하기

Ella.J 2020. 3. 2. 19:58
728x90
반응형

이번 시간은 본격적으로 가계부 입력타임! 가계부에서 제일 중요한 부분이겠죠? ㅎㅎ

입력을 위한 환경 설정, 가계부 내역 입력하기, 내역 수정하기 포스팅 시작해 보겠습니다!


첫 번째. 입력 환경 세팅하기

 

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 내용 = 현금, 계좌입금

구분(cbUseType) -> 수입 선택
계정(cbAccount) Item -> 수입계정 
입/출금 구분(cbIEType) Item -> 현금, 계좌입금 

2. 구분 - 지출 선택 -> cbAccount 내용 = 지출 계정, cbIEStandard 내용 = 현금, 체크카드, 신용카드, 타인계좌이체

구분(cbUseType) -> 지출 선택
계정(cbAccount) Item -> 지출계정

 

[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) = 계좌이름

입/출금 구분(cbIEType) -> 계좌입금 선택
입/출금 구분(cbIEType) -> 타인계좌이체 선택

2. 입/출금 구분(cbIEType) - 체크카드 선택 -> 입/출금 기준(cbIEStandard) = 체크카드 이름

입/출금 구분(cbIEType) -> 체크카드 선택

3. 입/출금 구분(cbIEType) - 신용카드 선택 -> 입/출금 기준(cbIEStandard) = 신용카드 이름

입/출금 구분(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!

728x90
반응형