DevExpress XtraGrid GridControl에서 변경된 행이나 신규 행만 처리 하는 방법


C#에서 Grid 컨트롤을 사용할 때 SELECT 쿼리 문으로 데이터를 가져와서 GridControl에 바인딩해서 보여주게 됩니다.

이렇게 가져온 Grid 컨트롤에서 특정 컬럼을 변경하거나 신규로 Row를 추가하여 테이블에 저장하는 작업을 하기도 하는데 일반적으로 저장할 때  어떤 행이 변경되었고, 어떤 행이 추가되었는지 알 수가 없기에 Grid의 모든 행을 다 처리하거나 변경되거나 추가된 Row를 선택한 다음 GetSelectedRows() 이용하여 처리하게 됩니다.

첫번째 방법처럼 모든 행을 다 처리하는 경우는 엄청난 비효율을 초례 합니다. 

Row의 수가 적을 때는 크게 문제 없지만 Row의 수가 많다고 하면 Row의 수만큼 Primary Key로 Select해서 데이터가 존재하면 Update 구문으로, 없으면 Insert 구문을 반복하게 됩니다. 실제로 변경된 Row는 1건인데 Grid의 모든 Row를 다시 Update하게 됩니다.

두번째 Row를 선택해서 처리하는 방법도 무척이나 불편한 방법 입니다.

변경하는 행이 많다고 하면 Grid를 스크롤 하면서 일일이 선택하는 작업을 해줘야 하는데 선택하는 행위 자체도 번거롭지만 혹시 잘못해서 선택을 누락한 경우 해당 Row는 Update가 되지 않는 큰 문제가 발생할 수도 있습니다.

효과적인 Grid 컨트롤을 처리하기 위해 Grid Control의 변경된 행(Row)과 신규로 추가된 행(Row)만 처리하는 방법이 필요합니다.

이번 글에서는 DevExpress XtraGrid GridControl에서 변경된 행이나 신규 행만 처리 하는 방법에 대해 알아보겠습니다.

C#에서 일반적인 GridControl의 Row 처리 방법

▼ 아래 화면과 같이 DevExpress XtraGrid의 GridContol에서 특기사항 열을 변경하고 처리하는 일반적인 작업 방법에 대한 설명입니다.

C#에서 일반적인 GridControl의 Row 처리 방법


▶ 방법 1 : 선택한 Rows만 처리하는 방법에 대한 예제입니다.

// 방법1 : 선택한 Rows만 처리하는 예
int[] selectedRows = grid1.GetSelectedRows();
foreach (int gridViewIndex in selectedRows)
{
    string pcSerial = grid1.GetRowCellValue(gridViewIndex, “PCSERIAL”).ToString().Trim();
 
    string sQuery = “SELECT FROM Table1 “;
    sQuery += string.Format(“WHERE pcSerial = ‘{0}’ “, pcSerial);
    //ExecuteReader() 해서
    if (DataRow.HsaRows)
      // UPDATE 구문 처리
    else
      // INSERT 구문 처리
}
 

▶ 방법 2 : GridControl의 전체 Rows를 순차적을 처리하는 방법에 대한 예제입니다.

// 방법2 : 전체 Rows 처리하는 예
for (int gridViewIndex = 0; gridViewIndex < grid1.RowCount; gridViewIndex++)
{
    string pcSerial = grid1.GetRowCellValue(gridViewIndex, “PCSERIAL”).ToString().Trim();
 
    string sQuery = “SELECT FROM Table1 “;
    sQuery += string.Format(“WHERE pcSerial = ‘{0}’ “, pcSerial);
    //ExecuteReader() 해서
    if (DataRow.HsaRows)
      // UPDATE 구문 처리
    else
      // INSERT 구문 처리
}
 

C#에서 효과적인 GridControl 처리 방법(변경되거나 새로 추가된 Rows만 처리)

– Row의 상태가 변경되면 Grid Control에 임의로 추가한 칼럼에 상태 변경 값(I,U)을 표시하고, 나중에 처리할 때 상태 변경 값이 있는 Row만 처리해 주면 됩니다.

1. GridControl의 Row 상태 변경 처리를 위한 변수 하나를 선언해 줍니다.

private string RowState = “”;


2. SELECT 구문으로 데이터를 가져올 때 Row 상태 컬럼을 추가해 줍니다.(예제에서는 ‘COLUID’라는 이름의 컬럼을 추가해 주었습니다.

//SELECT 구문에서 Row 상태 컬럼을 추가해줌.
string sQuery = “SELECT ” AS COLIUD, A.pcSerial, ….. “;
sQuery += “FROM Table1 “;
sQuery += string.Format(“WHERE …… “;
 
DataSet ds = new DataSet();
using (OracleDataAdapter adapter = new OracleDataAdapter(sQuery, EhwaLib.connORPM))
{
    adapter.Fill(ds);
    grid1.DataSource = ds.Tables[0];
}
 
DevExpress XtraGrid GridControl에서 변경된 행이나 신규 행만 처리 하는 방법


3. Grid Control의 CellValueChanged 이벤트가 발생할 때 Row의 상태 컬럼에 Row의 변경 또는 신규 추가에 대한 구분자 표시를 처리해 줍니다.

// CellValueChanged 이벤트가 발생할 때 Row 상태 컬럼에 구분자 표시
private void grid1_CellValueChanged(object sender, DevExpress.XtraGrid.Views.Base.CellValueChangedEventArgs e)
{
    if (RowState != “X”)    //Insert시 무한루프를 막기 위해서
    {
        if (e.RowHandle >= 0) // RowHandle 값이 0보다 작으면 신규 Row임
        {
            if (grid1.GetRowCellValue(e.RowHandle, “COLIUD”).ToString().Trim() != “I” &&
                grid1.GetRowCellValue(e.RowHandle, “COLIUD”).ToString().Trim() != “U”)
            {
                grid1.SetRowCellValue(e.RowHandle, “COLIUD”“U”); //Row가 변경됨
            }
        }
        else
        {
            RowState = “X”;  //SetRowCellValue 자체도 Cell이 변경되는 것이므로 Insert 무한루프를 막기 위해 먼저 ‘X’
            grid1.SetRowCellValue(e.RowHandle, “COLIUD”“I”); //Row가 추가됨
            RowState = “”;
        }
    }
}
 


4. 이제부터 Grid Control의 Row 상태 구분자를 활용하여 변경되거나 추가된 행(Row)만 처리해 주면 됩니다.

// Rows 상태 구분자로 처리하는 예
for (int gridViewIndex = 0; gridViewIndex < grid1.RowCount; gridViewIndex++)
{
    string strRowState = grid1.GetRowCellValue(gridViewIndex, “COLIUD”).ToString().Trim();
    string pcSerial = grid1.GetRowCellValue(gridViewIndex, “PCSERIAL”).ToString().Trim();
 
    if (strRowState == “U”)
      // UPDATE 구문 처리
    else if (strRowState == “I”)
      // INSERT 구문 처리
}
 

결론

Grid Control의 행(Row)의 수가 적을 때는 첫 번째 단락에서 언급한 일반적인 방식으로 처리하는 것이 더 단순하고 쉬울 수 있습니다.
하지만 행의 수가 많아지면 변경되거나 추가된 행만 처리하는 것이 훨씬 효율적입니다.

상황에 맞게 적절한 방법으로 Grid Control의 Row 처리를 해주면 됩니다.





이 글이 도움이 되었기를 바랍니다. ^-^


답글 남기기