Wanna be Brilliant Full-Stack Developer

C# WINFORMS DataRow, DataTable, DataSet 본문

Some Memos/C#

C# WINFORMS DataRow, DataTable, DataSet

Flashpacker 2023. 4. 27. 14:38

DataTable 은 엑셀과 같은 테이블과 같은자료! , DB형태의 데이터들이 테이블로 되어 있어서

테이블의 형태를 주고 받을때 자료를 저장하는것이 DataTable이다.

쏙 빼서 한줄로 만들수 있는것이 DataRow이고

테이블들을 여러개 모아놓은것을 DataSet이라고 보면 된다.

 

DataTable과 DataSet의 차이가 무엇인가 물어보면 DataSet이 Table들의 집합이라고 보면 된다.

Table들을 억지로 집어넣어서 하는 작업을 잘하지는 않고 Db에서 데이터를 주고 받을때 Dataset에 집어넣었다가

필요한 테이블만 빼서 사용을 많이 한다.

주로 메인이 되는것은 DataTable이다. 

 

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

namespace DataTable_Test
{
    public partial class Form1 : Form
    {
        DataSet ds = new DataSet();  // 반의 정보를 가지고 있을 DataSet


        public Form1()
        {
            InitializeComponent();
        }

        /// <summary>
        /// 등록 Button을 Click 했을 경우 반에 대한 DataTable을 만들고 DataTable을 DataSet에 등록
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnReg_Click(object sender, EventArgs e)
        {
            bool bCheckIsTalbe = false;

            // DataSet안에 해당하는 DataTable이 있는지 확인 한다
            if (ds.Tables.Contains(cboxRegClass.Text))
            {
                bCheckIsTalbe = true;
            }

            //foreach (DataTable oTable in ds.Tables)
            //{
            //    if (oTable.TableName.Contains(cboxRegClass.Text))
            //    {
            //        bCheckIsTalbe = true;
            //        break;
            //    }
            //}

            DataTable dt = null;

            if (!bCheckIsTalbe)  // 기존 Table이 없을 경우 신규로 생성
            {
                dt = new DataTable(cboxRegClass.Text);

                //DataColumn 생성
                DataColumn colName = new DataColumn("NAME", typeof(string));
                DataColumn colSex = new DataColumn("SEX", typeof(string));
                DataColumn colRef = new DataColumn("REF", typeof(string));

                //생성된 Column을 DataTable에 Add
                dt.Columns.Add(colName);
                dt.Columns.Add(colSex);
                dt.Columns.Add(colRef);
            }
            else  // 기존 Table이 있을 경우 기존 Table을 가져온다
            {
                dt = ds.Tables[cboxRegClass.Text];
            }


            //Row 생성
            DataRow row = dt.NewRow();
            row["NAME"] = tboxRegName.Text;

            if (rdoRegSexFemale.Checked)
            {
                row["SEX"] = "여자";
            }
            else if (rdoRegSexMale.Checked)
            {
                row["SEX"] = "남자";
            }

            row["REF"] = tboxRegRef.Text;


            //dt.Rows.Add(row);

            //ds.Tables.Add(dt);
            //if (bCheckIsTalbe)
            //{
            //    ds.Tables.Remove(cboxRegClass.Text);
            //    ds.Tables.Add(dt);
            //}

            //생성된 Row을 DataTable에 Add
            if (bCheckIsTalbe)
            {
                ds.Tables[cboxRegClass.Text].Rows.Add(row);  // DataSet에 해당 DataTalbe이 있을 경우 기존 Table에 Row를 추가한다
            }
            else
            {
                dt.Rows.Add(row);   // 신규로 작성한 DataTable에 Row를 등록 하고, 
                ds.Tables.Add(dt);  // 등록한 DataTable을 DataSet에 추가한다
            }

            cboxViewClass_SelectedIndexChanged(this, null);
        }


        /// <summary>
        /// DataSet에 있는 DataTable을 찾아서 선택한 DataRow를 삭제
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnViewDataDel_Click(object sender, EventArgs e)
        {
            int iSelectRow = dgViewInfo.SelectedRows[0].Index;  // 선택 한 Row 중에서 첫번째 Row번호를 가져온다
            ds.Tables[cboxViewClass.Text].Rows.RemoveAt(iSelectRow);   // Table에서 선택한 Row를 삭제 한다

            cboxViewClass_SelectedIndexChanged(this, null);
        }


        /// <summary>
        /// View 부분의 Combobox의 값을 변경 했을 경우 해당하는 Datagrid를 새로 표시해 주기 위해 사용
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void cboxViewClass_SelectedIndexChanged(object sender, EventArgs e)
        {
            dgViewInfo.DataSource = ds.Tables[cboxViewClass.Text];


            // DatagridView Cell 정렬 및 Number를 적용
            foreach (DataGridViewRow oRow in dgViewInfo.Rows)
            {
                oRow.HeaderCell.Value = oRow.Index.ToString();
            }
            dgViewInfo.AutoResizeRowHeadersWidth(DataGridViewRowHeadersWidthSizeMode.AutoSizeToAllHeaders);
        }


    }
}
      /// <summary>
        /// 수정
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnModify_Click(object sender, EventArgs e)
        {
            if (!string.IsNullOrEmpty(tboxRegName.Text))
            {
                foreach (DataRow oitem in ds.Tables[cboxRegClass.Text].Rows)
                {
                    if (oitem["NAME"].Equals(tboxRegName.Text)) {

                        if (rdoRegSexFemale.Checked)
                        {
                            oitem["SEX"] = "여자";
                        }
                        else if (rdoRegSexMale.Checked)
                        {
                            oitem["SEX"] = "남자";
                        }

                        oitem["REF"] = tboxRegRef.Text;

                    }
                }
            }
        }

'Some Memos > C#' 카테고리의 다른 글

C# WINFORMS Delegate  (0) 2023.04.27
C# WINFORMS 자료구조 #2 List, HashTable, Dictionary  (0) 2023.04.26
C# WINFORMS 자료구조1 Queue, Stack  (0) 2023.04.25
C# RowIndex, ColumnIndex 수정중  (0) 2023.04.25
C# WINFORMS Timer (Clicker Game)  (0) 2023.04.24