diff --git a/MainApp/MainApp/Controls/DataSet_Merge_Control.Designer.cs b/MainApp/MainApp/Controls/DataSet_Merge_Control.Designer.cs
new file mode 100644
index 0000000..beb256d
--- /dev/null
+++ b/MainApp/MainApp/Controls/DataSet_Merge_Control.Designer.cs
@@ -0,0 +1,95 @@
+
+namespace MainApp.Controls
+{
+ partial class DataSet_Merge_Control
+ {
+ ///
+ /// 필수 디자이너 변수입니다.
+ ///
+ private System.ComponentModel.IContainer components = null;
+
+ ///
+ /// 사용 중인 모든 리소스를 정리합니다.
+ ///
+ /// 관리되는 리소스를 삭제해야 하면 true이고, 그렇지 않으면 false입니다.
+ protected override void Dispose(bool disposing)
+ {
+ if (disposing && (components != null))
+ {
+ components.Dispose();
+ }
+ base.Dispose(disposing);
+ }
+
+ #region 구성 요소 디자이너에서 생성한 코드
+
+ ///
+ /// 디자이너 지원에 필요한 메서드입니다.
+ /// 이 메서드의 내용을 코드 편집기로 수정하지 마세요.
+ ///
+ private void InitializeComponent()
+ {
+ this.tableLayoutPanel1 = new System.Windows.Forms.TableLayoutPanel();
+ this.bottomGridView = new System.Windows.Forms.DataGridView();
+ this.topGridView = new System.Windows.Forms.DataGridView();
+ this.tableLayoutPanel1.SuspendLayout();
+ ((System.ComponentModel.ISupportInitialize)(this.bottomGridView)).BeginInit();
+ ((System.ComponentModel.ISupportInitialize)(this.topGridView)).BeginInit();
+ this.SuspendLayout();
+ //
+ // tableLayoutPanel1
+ //
+ this.tableLayoutPanel1.ColumnCount = 1;
+ this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F));
+ this.tableLayoutPanel1.Controls.Add(this.bottomGridView, 0, 1);
+ this.tableLayoutPanel1.Controls.Add(this.topGridView, 0, 0);
+ this.tableLayoutPanel1.Dock = System.Windows.Forms.DockStyle.Fill;
+ this.tableLayoutPanel1.Location = new System.Drawing.Point(0, 0);
+ this.tableLayoutPanel1.Name = "tableLayoutPanel1";
+ this.tableLayoutPanel1.RowCount = 2;
+ this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50F));
+ this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50F));
+ this.tableLayoutPanel1.Size = new System.Drawing.Size(371, 319);
+ this.tableLayoutPanel1.TabIndex = 1;
+ //
+ // bottomGridView
+ //
+ this.bottomGridView.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;
+ this.bottomGridView.Dock = System.Windows.Forms.DockStyle.Fill;
+ this.bottomGridView.Location = new System.Drawing.Point(3, 162);
+ this.bottomGridView.Name = "bottomGridView";
+ this.bottomGridView.RowTemplate.Height = 23;
+ this.bottomGridView.Size = new System.Drawing.Size(365, 154);
+ this.bottomGridView.TabIndex = 4;
+ //
+ // topGridView
+ //
+ this.topGridView.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;
+ this.topGridView.Dock = System.Windows.Forms.DockStyle.Fill;
+ this.topGridView.Location = new System.Drawing.Point(3, 3);
+ this.topGridView.Name = "topGridView";
+ this.topGridView.RowTemplate.Height = 23;
+ this.topGridView.Size = new System.Drawing.Size(365, 153);
+ this.topGridView.TabIndex = 3;
+ //
+ // DataSet_Merge_Control
+ //
+ this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 12F);
+ this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
+ this.Controls.Add(this.tableLayoutPanel1);
+ this.Name = "DataSet_Merge_Control";
+ this.Size = new System.Drawing.Size(371, 319);
+ this.tableLayoutPanel1.ResumeLayout(false);
+ ((System.ComponentModel.ISupportInitialize)(this.bottomGridView)).EndInit();
+ ((System.ComponentModel.ISupportInitialize)(this.topGridView)).EndInit();
+ this.ResumeLayout(false);
+
+ }
+
+ #endregion
+
+ private System.Windows.Forms.TableLayoutPanel tableLayoutPanel1;
+ private System.Windows.Forms.DataGridView bottomGridView;
+ private System.Windows.Forms.DataGridView topGridView;
+ }
+}
diff --git a/MainApp/MainApp/Controls/DataSet_Merge_Control.cs b/MainApp/MainApp/Controls/DataSet_Merge_Control.cs
new file mode 100644
index 0000000..84b0f6b
--- /dev/null
+++ b/MainApp/MainApp/Controls/DataSet_Merge_Control.cs
@@ -0,0 +1,67 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Data;
+using System.Drawing;
+using System.Linq;
+using System.Text;
+using System.Windows.Forms;
+
+namespace MainApp.Controls
+{
+ public partial class DataSet_Merge_Control : UserControl
+ {
+ public DataSet_Merge_Control()
+ {
+ InitializeComponent();
+
+ InitInstance();
+ }
+
+ private void InitInstance()
+ {
+ if (!AdoClient.Instance.SetConnection("peacecloud.synology.me,21433", "Study", "study", "Study123$"))
+ {
+ MessageBox.Show("Cannot access database.");
+ return;
+ }
+
+ DoWork();
+ }
+
+ private void BindTableToGridView(DataGridView gridView, DataTable table)
+ {
+ gridView.SuspendLayout();
+ gridView.DataSource = table;
+ gridView.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells;
+ gridView.ResumeLayout();
+ }
+
+ private void DoWork()
+ {
+ DataSet dataSet_before = AdoClient.Instance.Query("SELECT * FROM EMPLOYEE");
+
+ Random rnd = new Random();
+ int[] idxArr = new int[3]
+ {
+ rnd.Next(1000, 2000),
+ rnd.Next(1000, 2000),
+ rnd.Next(1000, 2000)
+ };
+
+ foreach (int idx in idxArr)
+ {
+ AdoClient.Instance.NonQuery($"INSERT INTO EMPLOYEE (ENO, ENAME, JOB, HIREDATE) VALUES ({idx}, 'e{idx}', 'processed', '{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}')");
+ }
+
+ AdoClient.Instance.NonQuery($"DELETE FROM EMPLOYEE WHERE ENO = {idxArr[1]}");
+
+ DataSet dataSet_after = AdoClient.Instance.Query("SELECT * FROM EMPLOYEE");
+
+ dataSet_before.Merge(dataSet_after); // 동일한 구조의 테이블이라면 변경된 레코드 모두 반영됨
+
+ BindTableToGridView(topGridView, dataSet_before.Tables[0]);
+ BindTableToGridView(bottomGridView, dataSet_after.Tables[0]);
+ }
+ }
+}
diff --git a/MainApp/MainApp/Controls/DataSet_Merge_Control.resx b/MainApp/MainApp/Controls/DataSet_Merge_Control.resx
new file mode 100644
index 0000000..1af7de1
--- /dev/null
+++ b/MainApp/MainApp/Controls/DataSet_Merge_Control.resx
@@ -0,0 +1,120 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ text/microsoft-resx
+
+
+ 2.0
+
+
+ System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
+ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089
+
+
\ No newline at end of file
diff --git a/MainApp/MainApp/MainApp.csproj b/MainApp/MainApp/MainApp.csproj
index f9711e5..1f1c1b1 100644
--- a/MainApp/MainApp/MainApp.csproj
+++ b/MainApp/MainApp/MainApp.csproj
@@ -55,6 +55,12 @@
+
+ UserControl
+
+
+ DataSet_Merge_Control.cs
+
UserControl
@@ -94,6 +100,9 @@
+
+ DataSet_Merge_Control.cs
+
Image_Insert_Select_Control.cs
diff --git a/MainApp/MainApp/MainForm.cs b/MainApp/MainApp/MainForm.cs
index b907523..a6b2638 100644
--- a/MainApp/MainApp/MainForm.cs
+++ b/MainApp/MainApp/MainForm.cs
@@ -46,7 +46,11 @@ namespace MainApp
//control.Dock = DockStyle.Fill;
//this.Controls.Add(control);
- Image_Insert_Select_Control control = new Image_Insert_Select_Control();
+ //Image_Insert_Select_Control control = new Image_Insert_Select_Control();
+ //control.Dock = DockStyle.Fill;
+ //this.Controls.Add(control);
+
+ DataSet_Merge_Control control = new DataSet_Merge_Control();
control.Dock = DockStyle.Fill;
this.Controls.Add(control);
}