1. DataRow의 각 컬럼값을 변경하기 전에, BeginEdit(), EndEdit() 를 호출한다.
2. 만약 대량을 데이터를 반복적으로 처리한다면, 해당하는 전체 DataRow를 BeingEdit() 설정후, 작업 종료 후 다시 전체 DataRow를 EndEdit() 처리한다.
3. AcceptChanges 호출 시 EndEdit()가 내부적으로 호출되지만, EndEidt() 후, AcceptChanges를 호출하는게 속도가 괜찮았다.
private void btnCopy_Click(object sender, EventArgs e)
{
DataTable dt2 = dt.Copy();
Debug.WriteLine("테이블 복사");
Stopwatch sw2 = new Stopwatch();
sw2.Start();
// 작업이 dt2의 각 행값을 반복으로 업데이트한다고 가정할 때!!!!
// 1. 전체 row를 편집모드로 변경함.
foreach (DataRow row in dt2.Rows)
{
row.BeginEdit();
}
// 2. DataRow의 각 컬럼값을 반복적으로 수정한다.
for (int operIdx = 0; operIdx < COLS_OPER; operIdx++)
{
for (int rowIdx = 0, n = dt2.Rows.Count; rowIdx < n; rowIdx++)
{
string sqlFormat = String.Format("COL{0}_0 = '{1}'", operIdx, dt2.Rows[rowIdx][operIdx * COLS_NUM]);
DataRow[] rows = dt2.Select(sqlFormat);
foreach (DataRow selectRow in rows)
{
for (int k = 0; k < COLS_NUM; k++)
{
selectRow["COL" + operIdx + "_" + k] = dt.Rows[rowIdx][operIdx * COLS_NUM + k];
}
}
}
//Debug.Write(operIdx);
}
// 3. 전체 row를 편집모드 종료함.
foreach (DataRow row in dt2.Rows)
{
row.EndEdit();
}
dt2.AcceptChanges();
sw2.Stop();
Debug.WriteLine("\n검색후복사1: " + sw2.Elapsed.ToString());
sw2.Restart();
grid1.DataSource = dt2;
sw2.Stop();
Debug.WriteLine("\n검색후복사2: " + sw2.Elapsed.ToString());
}
728x90
'Programming Language > C#' 카테고리의 다른 글
[grapecity/farpoint] fix spread column size (0) | 2020.07.08 |
---|---|
spread 에서 sheet 복사 (0) | 2020.06.18 |
DataTable 데이터 복제 (0) | 2020.06.03 |
NLog 사용 샘플 (0) | 2020.04.25 |
[펌] Correlation of two arrays in C# (0) | 2020.02.06 |