DataGridView 갱신데이타 저장
DataGridView 컨트롤을 이용해 단순히 테이블을 보여주기는 것을 넘어, DataGridView 컨트롤에서 사용자가 추가, 수정, 삭제한 내용들을 SQL 서버등의 데이타 소스에 저장하길 원할 수 있다. 이를 구현하는데 자주 이용되는 한 방법은 DataAdapter (예: SqlDataAdapter)의 일괄 갱신(Update) 기능을 이용하는 것이다. (특히, Visual Studio의 데이타 소스 구성 마법사(Data Source Configuration Wizard)는 DataSet 및 TableAdapter등의 필요한 클래스들을 자동으로 생성해 주기 때문에 일괄 갱신을 더욱 손쉽게 해준다.)
다음은 갱신데이타 저장을 위한 한 방식에 대한 스탭들이다.
(1) DataGridView 컨트롤을 Form 위에 놓는다
(2) DataGridView 속성창 => DataSource 속성에서 [새 프로젝트 데이타 소스 (Add Project Data Source)] 선택
(3) [데이타 소스 구성 마법사]에서 SQL 서버로부터 (혹은 다른 데이타 소스 사용) 테이블에 대한 DataSet 생성
(4) 위와 같이 하면 자동으로 *DataSet.xsd 파일과 소소 파일들이 생성된다. DataGridView의 DataSource가 (Step 3에서) 설정되어 별도 코드 없이 테이블 데이타를 보여주게 된다.
(5) DataGridView에서 갱신된 데이타를 저장하기 위해서는 먼저 DataGridView의 DataSource로 부터 DataSet객체를 얻는다. DataSet 안에 있는 DataTable에 DataGridView가 갱신한 데이타가 있으므로 이를 저장해야 한다. 갱신은 아래 예제에서 보듯이 Step 3에서 자동 생성된 TableAdapter클래스의 Update()메서드를 호출하면 된다. 이 메서드는 내부적으로 DataAdapter의 Update()를 호출하여 서버에 데이타를 저장한다.
다음은 갱신데이타 저장을 위한 한 방식에 대한 스탭들이다.
(1) DataGridView 컨트롤을 Form 위에 놓는다
(2) DataGridView 속성창 => DataSource 속성에서 [새 프로젝트 데이타 소스 (Add Project Data Source)] 선택
(3) [데이타 소스 구성 마법사]에서 SQL 서버로부터 (혹은 다른 데이타 소스 사용) 테이블에 대한 DataSet 생성
(4) 위와 같이 하면 자동으로 *DataSet.xsd 파일과 소소 파일들이 생성된다. DataGridView의 DataSource가 (Step 3에서) 설정되어 별도 코드 없이 테이블 데이타를 보여주게 된다.
(5) DataGridView에서 갱신된 데이타를 저장하기 위해서는 먼저 DataGridView의 DataSource로 부터 DataSet객체를 얻는다. DataSet 안에 있는 DataTable에 DataGridView가 갱신한 데이타가 있으므로 이를 저장해야 한다. 갱신은 아래 예제에서 보듯이 Step 3에서 자동 생성된 TableAdapter클래스의 Update()메서드를 호출하면 된다. 이 메서드는 내부적으로 DataAdapter의 Update()를 호출하여 서버에 데이타를 저장한다.
예제
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 MyWinForm
{
public partial class FormDGV : Form
{
public FormDGV()
{
InitializeComponent();
}
private void FormDGV_Load(object sender, EventArgs e)
{
this.scoresTableAdapter.Fill(this.testDBDataSet.Scores);
}
// 갱신 데이타 저장
private void btnSave_Click(object sender, EventArgs e)
{
//DataSource로부터 DataSet 객체를 추출
//TestDBDataSet은 자동 생성된 DataSet 파생클래스
BindingSource bs = (BindingSource)dataGridView1.DataSource;
TestDBDataSet ds = bs.DataSource as TestDBDataSet;
// 자동 생성된 TableAdapter 클래스의 Update() 호출.
// 갱신데이타 소스인 DataTable을 파라미터로 넘김
this.scoresTableAdapter.Update(ds.Scores);
}
}
}
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace MyWinForm
{
public partial class FormDGV : Form
{
public FormDGV()
{
InitializeComponent();
}
private void FormDGV_Load(object sender, EventArgs e)
{
this.scoresTableAdapter.Fill(this.testDBDataSet.Scores);
}
// 갱신 데이타 저장
private void btnSave_Click(object sender, EventArgs e)
{
//DataSource로부터 DataSet 객체를 추출
//TestDBDataSet은 자동 생성된 DataSet 파생클래스
BindingSource bs = (BindingSource)dataGridView1.DataSource;
TestDBDataSet ds = bs.DataSource as TestDBDataSet;
// 자동 생성된 TableAdapter 클래스의 Update() 호출.
// 갱신데이타 소스인 DataTable을 파라미터로 넘김
this.scoresTableAdapter.Update(ds.Scores);
}
}
}
DataGridView에서 Context Menu 사용
DataGridView 컨트롤에서 Context Menu를 사용하기 위해서 (한 방법으로) 다음과 같은 스텝을 따른다.
(1) Form 위에 ContextMenuStrip 컨트롤을 드래그 앤 드롭한다
(2) ContextMenuStrip 컨트롤에서 메뉴를 추가한다 (메뉴문자열을 정한다).
(3) DataGridView 컨트롤을 누르고 속성창에서 ContextMenuStrip 속성을 찾아 (1)에서 생성한 ContextMenuStrip 컨트롤을 지정한다
(4) DataGridView 컨트롤 속성창에서 이벤트 중 CellMouseDown 이벤트를 선택하고 이벤트핸들러를 추가한다. 여기서 아래 예제와 같이 오른쪽 버튼이 클릭된 경우 현재 Cell을 선택하는 코드를 넣는다.
(5) 이후 (3)에서 설정된 대로 Context Menu가 표시된다.
이 스텝들을 따르면 DataGridView 에서 오른쪽 마우스 버튼을 누르면 해당 Cell 로 이동하면서 동시에 해당 위치에서 Context Menu가 표시된다.
(1) Form 위에 ContextMenuStrip 컨트롤을 드래그 앤 드롭한다
(2) ContextMenuStrip 컨트롤에서 메뉴를 추가한다 (메뉴문자열을 정한다).
(3) DataGridView 컨트롤을 누르고 속성창에서 ContextMenuStrip 속성을 찾아 (1)에서 생성한 ContextMenuStrip 컨트롤을 지정한다
(4) DataGridView 컨트롤 속성창에서 이벤트 중 CellMouseDown 이벤트를 선택하고 이벤트핸들러를 추가한다. 여기서 아래 예제와 같이 오른쪽 버튼이 클릭된 경우 현재 Cell을 선택하는 코드를 넣는다.
(5) 이후 (3)에서 설정된 대로 Context Menu가 표시된다.
이 스텝들을 따르면 DataGridView 에서 오른쪽 마우스 버튼을 누르면 해당 Cell 로 이동하면서 동시에 해당 위치에서 Context Menu가 표시된다.
예제
private void dataGridView1_CellMouseDown(object sender, DataGridViewCellMouseEventArgs e)
{
// Row헤더, Column헤더인 경우 그냥 리턴
if (e.RowIndex == -1 || e.ColumnIndex == -1) return;
// 오른쪽 마우스 버튼인 경우
if (e.Button == MouseButtons.Right)
{
var grid = sender as DataGridView;
// 마우스 RightClick해도 현재 Cell 을 선택함
grid.CurrentCell = grid.Rows[e.RowIndex].Cells[e.ColumnIndex];
}
}
{
// Row헤더, Column헤더인 경우 그냥 리턴
if (e.RowIndex == -1 || e.ColumnIndex == -1) return;
// 오른쪽 마우스 버튼인 경우
if (e.Button == MouseButtons.Right)
{
var grid = sender as DataGridView;
// 마우스 RightClick해도 현재 Cell 을 선택함
grid.CurrentCell = grid.Rows[e.RowIndex].Cells[e.ColumnIndex];
}
}