VB.NET/C# DataGridView 특정 로우 중간에 행 삽입하기
2019. 8. 20. 16:06ㆍVB.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
반응형
'VB.NET' 카테고리의 다른 글
VB.NET DataGridView to Datatable 변환하기 (0) | 2019.08.20 |
---|---|
VB.NET Ctrl + A 키 입력 받기 (0) | 2019.08.20 |
VB.NET 드래그 앤 드랍 구현 하기 (0) | 2019.06.20 |
VB.NET 기초 사용법 정리 (0) | 2019.06.13 |
VB.NET 여러 개의 컨트롤을 List<T>에 담아 한 번에 특정 조건의 개수 Count 하기 (0) | 2019.05.17 |