본문 바로가기

개발 Tip/ASP .Net

[ASP.Net2.0] GridView 웹 서버 컨트롤에 바인딩된 행에 대한 대량 업데이트 수행

참고 사이트 : http://msdn.microsoft.com/ko-kr/library/aa992036(VS.80).aspx

GridView에서 다수 데이터가 수정된 사항에서 한꺼번에 업데이트를 하기 위한 작업.
이것도 이번 프로젝트 작업에서 필요한 거라 정리한다.

1. 사전작업으로 GridView 바인딩을 하면서 원래 데이터 보관 - ViewState 사용
private bool tableCopied = false;
private DataTable originalDataTable;

protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.DataRow)
if (!tableCopied)
{
originalDataTable = ((DataRowView)e.Row.DataItem).Row.Table.Copy();
ViewState["originalValuesDataTable"] = originalDataTable;
tableCopied = true;
}
}

2. 버튼 클릭시 저장하기 위한 작업

protected void UpdateButton_Click(object sender, EventArgs e)
{
originalDataTable = (DataTable)ViewState["originalValuesDataTable"];

foreach (GridViewRow r in GridView1.Rows)
if (IsRowModified(r)) { GridView1.UpdateRow(r.RowIndex, false); }

// Rebind the Grid to repopulate the original values table.
tableCopied = false;
GridView1.DataBind();
}

protected bool IsRowModified(GridViewRow r)
{
int currentID;
string currentTitleOfCourtesy;
string currentLastName;
string currentFirstName;
string currentTitle;
string currentExtension;

currentID = Convert.ToInt32(GridView1.DataKeys[0].Value);

currentTitleOfCourtesy = ((TextBox)r.FindControl("TitleOfCourtesyTextBox")).Text;
currentLastName = ((TextBox)r.FindControl("LastNameTextBox")).Text;
currentFirstName = ((TextBox)r.FindControl("FirstNameTextBox")).Text;
currentTitle = ((TextBox)r.FindControl("TitleTextBox")).Text;
currentExtension = ((TextBox)r.FindControl("ExtensionTextBox")).Text;

DataRow row =
originalDataTable.Select(String.Format("EmployeeID = {0}", currentID))[0];

if (!currentTitleOfCourtesy.Equals(row["TitleOfCourtesy"].ToString())) { return true; }
if (!currentLastName.Equals(row["LastName"].ToString())) { return true; }
if (!currentFirstName.Equals(row["FirstName"].ToString())) { return true; }
if (!currentTitle.Equals(row["Title"].ToString())) { return true; }
if (!currentExtension.Equals(row["Extension"].ToString())) { return true; }

return false;
}

--> 버튼 클릭하였을 때 현재 변경된 부분을 보관해둔 ViewState의 값과 비교하여 다른 부분만 GridView를 업데이트 처리
음...근데 대충 정리를 하다보니 이것도 내가 원하는 방식이 아니네
일단 이건 SqlDataSource를 사용하고 GridView 설정을 하면서 Update 쿼리문을 지정을 해주어야 한다.
지금 프로젝트에서는 일반 업데이트 쿼리가 아니라 저장 프로시져를 사용하는 거라
조금 다르게 작업을 해야겠네....일단 이런 방법으로 하는 거라 생각만 해두고
작업이 완료되면 다시 따로 정리할 예정.