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

+ Recent posts