VB.NET/C# DataGridView 특정 로우 중간에 행 삽입하기

2019. 8. 20. 16:06VB.NET

728x90
반응형

 

 

 

 

위와 같이 행삽입 버튼을 누르면 누른 행 아래 행내용 복사하여 행추가 되는 기능을 만들자.

작업 순서

① DataGridView에 기본 Data를 채운다.

② Button을 눌렀을 때 선택한 행이 복사되어 행을 추가한다.


① DataGridView에 기본 Data를 채운다.

DataGridView에 값을 채우기 위해 아무 값을 넣은 csv파일을 Datatable로 담아와

DataGridView의 DataSource에 넣기 위해 csv to DataTable을 담는 사용자 함수를 만든다.

C#

      private DataTable ReadCSV(string Filename)
        {
            // 파일 경로만 넣으면 CSV 파일을 Datatable로 담는 함수
            DataTable dt = new DataTable();
            bool firstLine = true;

            string[] Data;

            using (Microsoft.VisualBasic.FileIO.TextFieldParser myreader = new Microsoft.VisualBasic.FileIO.TextFieldParser(Filename, System.Text.Encoding.GetEncoding("euc-kr")))
            {
                myreader.TextFieldType = Microsoft.VisualBasic.FileIO.FieldType.Delimited;
                myreader.SetDelimiters(",");
                while (!myreader.EndOfData)
                {
                    Data = myreader.ReadFields();
                    if (firstLine == true)
                    {
                        firstLine = false;
                        foreach (string item in Data)
                        {
                            DataColumn dCol = new DataColumn();
                            dCol.DataType = System.Type.GetType("System.String");
                            dCol.ColumnName = item;
                            dt.Columns.Add(dCol);
                        }// DataColumn Header 만드는 부분
                    }
                    else
                    {
                        DataRow row = dt.NewRow();
                        row.ItemArray = Data;
                        dt.Rows.Add(row);
                    }// DataRow 만드는 부분
                }
            }
            return dt;
        }

 

 

VB.NET

   Public Function ReadCSV(Filename As String) As DataTable
        Dim dt As New Data.DataTable()
        Dim line As String = Nothing
        Dim i As Integer = 0
        Dim firstLine As Boolean = True
        Dim Data As String()

        Using myreader As New Microsoft.VisualBasic.FileIO.TextFieldParser(Filename, System.Text.Encoding.GetEncoding("euc-kr"))
            myreader.TextFieldType = FileIO.FieldType.Delimited
            myreader.SetDelimiters(",")
            While Not myreader.EndOfData
                Data = myreader.ReadFields()
                If firstLine = True Then
                    firstLine = False
                    For Each item In Data
                        Dim dCol As Data.DataColumn = New Data.DataColumn()
                        dCol.DataType = System.Type.GetType("System.String")
                        dCol.ColumnName = item
                        dt.Columns.Add(dCol)
                    Next
                Else
                    Dim row As Data.DataRow = dt.NewRow()
                    row.ItemArray = Data
                    dt.Rows.Add(row)
                End If
            End While
        End Using
        Return dt
    End Function

② Button을 눌렀을 때 선택한 행이 복사되어 행을 추가한다.

버튼을 눌렀을 때 행이 삽입 될 수 있도록 코드를 작성한다.

C#

        private void Form1_Load(object sender, EventArgs e)
        {
            DataTable dt = new DataTable();

            //* 데이터 테이블을 간단히 가져오기 위해 csv 파일을 이용 했습니다.
            dt = ReadCSV(@"C:\WorkSpace\01. Work\2019\07. July\0723\te\test.csv");

            // csv 파일을 제대로 가져와 dt가 null이 아니고, row가 하나라도 있을 때만 추가합니다.
            if (dt != null && dt.Rows.Count != 0)
                DataGridView1.DataSource = dt;

        }

VB.NET

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load

        '  데이터 테이블을 간단히 가져오기 위해 csv 파일을 이용 했습니다.
        dt = ReadCSV("C:\WorkSpace\01. Work\2019\07. July\0723\te\test.csv")

        '  csv파일이 제대로 가져와져서 dt가 nothing이 아니고, 로우가 하나라도 있을 때만 추가 합니다.
        If Not (dt Is Nothing) And Not (dt.Rows.Count = 0) Then
            DataGridView1.DataSource = dt
        End If

    End Sub

최종 실행 화면


Full Source

C#

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

namespace WinFormTest2
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();

            Button2.Click += new EventHandler(BtnClick);


        }

        private void Form1_Load(object sender, EventArgs e)
        {
            DataTable dt = new DataTable();

            //* 데이터 테이블을 간단히 가져오기 위해 csv 파일을 이용 했습니다.
            dt = ReadCSV(@"C:\WorkSpace\01. Work\2019\07. July\0723\te\test.csv");

            // csv 파일을 제대로 가져와 dt가 null이 아니고, row가 하나라도 있을 때만 추가합니다.
            if (dt != null && dt.Rows.Count != 0)
                DataGridView1.DataSource = dt;

        }

        private void BtnClick(object sender, EventArgs e)
        {
            DataGridViewAddRow(DataGridView1);

        }

        private void DataGridViewAddRow(DataGridView dgv)
        {
            List<string> rowValues = new List<string>();

            DataTable dt = (DataTable)(DataGridView1.DataSource);

            if (dgv.SelectedRows.Count > 0)
            {
                for (int i = 0; i <= dgv.ColumnCount - 1; i++)
                {
                    rowValues.Add(dgv[i, dgv.CurrentCell.RowIndex].Value.ToString());
                }

                DataRow dr = dt.NewRow();

                dr.ItemArray = rowValues.ToArray();
                dt.Rows.InsertAt(dr, dgv.CurrentCell.RowIndex);
            }

            dgv.DataSource = dt;
        }


        private DataTable ReadCSV(string Filename)
        {
            // 파일 경로만 넣으면 CSV 파일을 Datatable로 담는 함수
            DataTable dt = new DataTable();
            bool firstLine = true;

            string[] Data;

            using (Microsoft.VisualBasic.FileIO.TextFieldParser myreader = new Microsoft.VisualBasic.FileIO.TextFieldParser(Filename, System.Text.Encoding.GetEncoding("euc-kr")))
            {
                myreader.TextFieldType = Microsoft.VisualBasic.FileIO.FieldType.Delimited;
                myreader.SetDelimiters(",");
                while (!myreader.EndOfData)
                {
                    Data = myreader.ReadFields();
                    if (firstLine == true)
                    {
                        firstLine = false;
                        foreach (string item in Data)
                        {
                            DataColumn dCol = new DataColumn();
                            dCol.DataType = System.Type.GetType("System.String");
                            dCol.ColumnName = item;
                            dt.Columns.Add(dCol);
                        }// DataColumn Header 만드는 부분
                    }
                    else
                    {
                        DataRow row = dt.NewRow();
                        row.ItemArray = Data;
                        dt.Rows.Add(row);
                    }// DataRow 만드는 부분
                }
            }
            return dt;
        }
    }
}

VB.NET

Public Class Form1
    Private dt As DataTable = New DataTable
    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load

        '//  데이터 테이블을 간단히 가져오기 위해 csv 파일을 이용 했습니다.
        //dt = ReadCSV("C:\WorkSpace\01. Work\2019\07. July\0723\te\test.csv")
        dt = ReadCSV("주소")

        '// csv파일이 제대로 가져와져서 dt가 nothing이 아니고, 로우가 하나라도 있을 때만 추가 합니다.
        If Not (dt Is Nothing) And Not (dt.Rows.Count = 0) Then
            DataGridView1.DataSource = dt
        End If

    End Sub

    Private Sub DataGridViewDBUpdate(sender As Object, e As EventArgs) Handles Button1.Click
        Try
            For Each dr As DataRow In dt.Rows
                dr.Item(0) = "HI"
                dr.Item(1) = "악마성"
            Next
        Catch ex As Exception
            MessageBox.Show(ex.Message)
        End Try

    End Sub

    Private Sub Btn_addrow_Click(sender As Object, e As EventArgs) Handles Button2.Click

        DataGridViewAddRow(DataGridView1)

    End Sub

    Private Sub DataGridViewAddRow(ByRef dgv As DataGridView)
        Dim rowValues As List(Of Object) = New List(Of Object)

        '* DataGridView를 DataTable로 변환
        Dim dt As DataTable = TryCast(DataGridView1.DataSource, DataTable)

        ' 삭제할 로우를 선택 했을 때만 동작하도록
        If (dgv.SelectedRows.Count > 0) Then

            For i As Integer = 0 To dgv.ColumnCount - 1
                ' 컬럼 전체를 반복해서 List에 넣음
                '(내용 채워넣기 귀찮아서 선택한 위에 값 복제함.
                rowValues.Add(dgv.Item(i, dgv.CurrentCell.RowIndex).Value)
            Next

            ' DataRow 추가
            Dim dr As DataRow = dt.NewRow

            ' DataRow에 List값 넣음.
            dr.ItemArray = rowValues.ToArray

            ' DataTable에 추가
            ' * CurrentCell.RowIndex 현재 선택 한 rowindex
            dt.Rows.InsertAt(dr, dgv.CurrentCell.RowIndex)

        End If

        ' DataGridView에 반영
        dgv.DataSource = dt


    End Sub


    Public Function ReadCSV(Filename As String) As DataTable
        Dim dt As New Data.DataTable()
        Dim line As String = Nothing
        Dim i As Integer = 0
        Dim firstLine As Boolean = True
        Dim Data As String()

        Using myreader As New Microsoft.VisualBasic.FileIO.TextFieldParser(Filename, System.Text.Encoding.GetEncoding("euc-kr"))
            myreader.TextFieldType = FileIO.FieldType.Delimited
            myreader.SetDelimiters(",")
            While Not myreader.EndOfData
                Data = myreader.ReadFields()
                If firstLine = True Then
                    firstLine = False
                    For Each item In Data
                        Dim dCol As Data.DataColumn = New Data.DataColumn()
                        dCol.DataType = System.Type.GetType("System.String")
                        dCol.ColumnName = item
                        dt.Columns.Add(dCol)
                    Next
                Else
                    Dim row As Data.DataRow = dt.NewRow()
                    row.ItemArray = Data
                    dt.Rows.Add(row)
                End If
            End While
        End Using
        Return dt
    End Function


End Class

 

 

 

728x90
반응형