트레이닝 센터

데이터 상호작용

C1FlexGrid고성능 빅 데이터 로딩방법

C1FlexGrid을 사용하여 최종사용자를 위한 고성능 업무 데이터의 표시와 관리능력을 제공합니다. C1FlexGrid는 표 양식컨트롤 데이터 처리능력을 완벽하게 갖추고 있습니다. 바인딩 데이터 소스는 물론 논 바인딩 모드도 수지상 업무데이터 모드이며 고성능으로 데이터를 로딩할 수 있습니다. 100만행 × 10열 데이터 로딩은 0.27초면 가능합니다.


본편에서는 FlexGrid가 어떻게 빅 데이터를 로딩하는지 확인할 수 있습니다.


1. 데이터소스 정의

먼저, 10열 FlexGrid 데이터소스를 정의합니다. 코드는 다음과 같습니다. :

public class MyItem
    {
        public int ID { get; set; }
        public string 성명 { get; set; }
        public bool? 표기 { get; set; }
        public DateTime? 일자 { get; set; }
        public double? 값1 { get; set; }
        public double? 값2 { get; set; }
        public double? 값3 { get; set; }
        public double? 값4 { get; set; }
        public double? 값5 { get; set; }
        public double? 값6 { get; set; }
    }

2. BackgroundWorker를 통해 FlexGrid데이터 로딩

BackgroundWorker는 .NET에서 사용되는 다중 스레드 미션을 수행하는 컨트롤입니다. 편집자가 다중 스레드에서 단독적으로 일련의 작업을 하는 것을 허용합니다. 해당 컨트롤은 3개의 이벤트:DoWork , ProgressChanged 및 RunWorkerCompleted가 있습니다. 프로그램에서RunWorkerAsync방법을 실행하면 DoWork이벤트가 가동되어 처리하게 됩니다. 이벤트의 처리는 이벤트 처리과정 중, ReportProgress방법을 실행하면 ProgressChanged 이벤트가 가동되어 처리하게 됩니다. DoWork이벤트 처리가 마무리 되면RunWorkerCompleted이벤트가 생성됩니다.


FlexGrid초기화:

Command Click에서 FlexGrid데이터 소스를 없앱니다. 행렬 값을 다시 취득하여 RunWorkerAsync방법을 실행합니다. 구체적인 코드는 다음과 같습니다. :


c1Command1.Enabled = false;

            // clear FlexGrid
            c1FlexGrid1.DataSource = null;
            c1FlexGrid1.Rows.Count = 1;
            c1FlexGrid1.Cols.Count = 1;

            count = (int)txtCount.Value;
            progressBar.Maximum = count;

            // run background worker
            worker.RunWorkerAsync();

FlexGrid데이터 소스 준비:

프로그램 중 RunWorkerAsync방법을 실행하면 DoWork이벤트가 가동되어 처리됩니다. 해당 이벤트에서 FlexGrid가 필요한 빅 데이터를 준비합니다. 코드는 다음과 같습니다.

for (int i = 0; i < count; i++)
{
                    // report progress periodically
                    if (i % 1000 == 0)
                    {
                        worker.ReportProgress(0, i);
                    }

                    MyItem m = new MyItem();
                    m.ID = i;
                    m.성명 = "Row" + i.ToString();
                    m.표기 = i % 2 == 0 ? true : false;
                    m.일자 = DateTime.Now.Add(new TimeSpan(i, i, i));
                    m.값1 = (double)rnd.Next(int.MaxValue);
                    m.값2 = (double)rnd.Next(int.MaxValue);
                    m.값3 = (double)rnd.Next(int.MaxValue);
                    m.값4 = (double)rnd.Next(int.MaxValue);
                    m.값5 = (double)rnd.Next(int.MaxValue);
                    m.값6 = (double)rnd.Next(int.MaxValue);
		list.Add(m);
}

FlexGrid데이터량 동시 표시:

DoWork이벤트 처리 과정 중, ReportProgress를 실행하면 ProgressChanged이벤트가 생성됩니다. 더 나아가 FlexGrid가 로딩한 데이터소스의 상태를 처리하고 데이터 량(행렬 개수)을 동시에 표시하게 됩니다. 코드는 다음과 같습니다.

void worker_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
	lblStatus.Text = string.Format("{0} / {1} 행", ((int)e.UserState).ToString(), count.ToString());
	lblStatus.Text = string.Format("{0} / {1} 行", ((int)e.UserState).ToString(), count.ToString());
}

FlexGrid데이터 소스 로딩:

DoWork이벤트 처리 종료 후, RunWorkerCompleted이벤트가 생성됩니다. 해당 이벤트 내에서 FlexGrid의 데이터 소스를 로딩하고 각 열의 데이터 유형을 작성합니다. 코드는 다음과 같습니다. :


void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
            var items = (IList)e.Result;
            if (items.Count == 0)
            {
		MessageBox.Show("내부저장한도를 초과했습니다. 개수가 적은 항목모음으로 시도해 보세요. ");
            }
	else
            {
                try
                {
                    // load flexgrid with redraw = false for best performance
                    c1FlexGrid1.Redraw = false;
                    c1FlexGrid1.DataSource = items;
                    c1FlexGrid1.Redraw = true;

		// custom editors
		c1FlexGrid1.Cols["일자"].Editor = dateTimePicker1;
                    c1FlexGrid1.Cols["값1"].Editor = numericUpDown1;
                    c1FlexGrid1.Cols["값2"].Editor = numericUpDown1;
                    c1FlexGrid1.Cols["값3"].Editor = numericUpDown1;
                    c1FlexGrid1.Cols["값4"].Editor = numericUpDown1;
                    c1FlexGrid1.Cols["값5"].Editor = numericUpDown1;
                    c1FlexGrid1.Cols["값6"].Editor = numericUpDown1;
                }
	catch (Exception)
                {
                    MessageBox.Show("내부저장한도를 초과했습니다. 개수가 적은 항목모음으로 시도해 보세요.");
}
               c1Command1.Enabled = true;
}

이렇게 Demo에서의FlexGrid는 기다릴 필요 없이 백만 행의 데이터를 표시할 수 있습니다. 결과는 다음 그림과 같습니다.



샘플 다운로드



한국 그레이프시티 공식카페에서 기술지원을 받으실 수 있습니다.
이메일을 통해서도 기술지원을 받으실 수 있습니다.