회사에는 FarPoint라는 이쁘고 쉽게 구현 가능한 컴퍼넌트가 있습니다. 제가 잘 사용 못하는건지 맨 처음 메모리에 올릴 때 화면이 늦게 떠서 이번 프로젝트에는 성능 좋은 DataGridView를 이용하였습니다. Column 7개에 30~500개 되는 Row를 추가해 주어야 하였습니다.

 

(바인딩을 이용하진 않았습니다. 직접 Colume, Row에 Index로 접근하여 데이터를 삽입하는 것도 같은 성능 개선 효과를 내기 때문에 바인딩에 신경 안쓰셔도 됩니다.)

 

아래와 같이 DataGridView의 AutoSizeColumnsMode를 AllCells로 지정하고 바인딩하였습니다.

Column 크기를 제가 직접 작성하기 귀찮아서 AutoSize모드를 설정하였었습니다.

그런데 이상하게 너무 느린겁니다. 30개 정도 DataGridView에 넣는데는 상관없지만 500개이상되면 5초 이상 걸리게 되었습니다.

/// <summary>

        /// 좋지 않은 예제

        /// </summary>

        /// <param name="dt"></param>

        private void StartBadExample(DataTable dt)

        {

            //AutoSizeColumnMode None 아닌것으로 설정

            this.dgv_test.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells;

 

            this.dgv_test.SuspendLayout();

 

            System.Diagnostics.Stopwatch st = new System.Diagnostics.Stopwatch();

            st.Start();

            this.dgv_test.DataSource = dt;

            st.Stop();

            System.Diagnostics.Debug.WriteLine(st.Elapsed.ToString());

 

            this.dgv_test.ResumeLayout();

        }

 

 

그래서 이것저것 찾아본 결과 답을 얻게 되었습니다.

코드 내용은 아래와 같습니다.

/// <summary>

        /// 좋은 예제

        /// </summary>

        /// <param name="dt"></param>

        private void StartGoodExample(DataTable dt)

        {

            this.dgv_test.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.None;

 

            this.dgv_test.SuspendLayout();

           

            System.Diagnostics.Stopwatch st = new System.Diagnostics.Stopwatch();

            st.Start();

            this.dgv_test.DataSource = dt;

            st.Stop();

            System.Diagnostics.Debug.WriteLine(st.Elapsed.ToString());

 

            //AutoSizeColumnsMode 변경

            this.dgv_test.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;

 

 

            //TopLeftHeaderCell 또는 RowHeader 이용한다면 변경

            this.dgv_test.RowHeadersWidth = 100;

 

            this.dgv_test.ResumeLayout();

        }

 

 

데이터 삽입 전 AutoSizeColumnsMode를 DataGridViewAutoSizeColumnsMode.None으로 설정 하시고, 데이터를 모두 삽입한 후 AutoSizeColumnsMode를 원하시는 것으로 변경해주시면 되겠습니다.

 

DataGridView의 Cell 그리는 로직은 AutoSizeColumnsMode의 값이 None이 아닐 경우에는 이전 그려진 Cell들을 다시 그리느냐고 느려지는 것 같습니다.

 

Column 10개, Row 300개로 테스트 한 결과는 아래와 같이 엄청난 차이를 보입니다.

StartBadExample의 시간: 00:00:00.3024992

StartGoodExample의 시간: 00:00:00.0000006

+ Recent posts