C#/winform

[C#][winform][dev]SchedulerControl 사용하기-1(feat. DataTable)

ㅋㅋ! 2024. 12. 9. 16:43

**본 글은 DevExpress 컴포넌트를 이용한 경우에만 참고 할 수 있다.

 

SchedulerControl은 일정 정보를 쉽게 관리하고, 여러가지 형태로 데이터를 보여준다.

012
Devexpress SchedulerControl의 다양한 views

 

오늘은 이 SchdulerControl에 일정 정보가 담긴 DataTable을 바인딩하여 데이터를 조회해보자.

 

개발하기전에 알아야 할 것

1.Appointment

SchedulerControl을 구성하는 데이터는 Appointment로 이뤄진다.

이해하기 쉽게 예를 들자면,

DataTable을 구성하는 DataRow = SchedulerControl을 구성하는 Appointment

라고 보면된다.

 

자세한 내용은 아래 링크참조

https://docs.devexpress.com/WindowsForms/1753/controls-and-libraries/scheduler/appointments

 

Appointments | WinForms Controls | DevExpress Documentation

Basic Appointment Information Scheduler appointments are objects of the Appointment class. Appointments store the following data: Stored Data Description Start and end dates DateTime values assigned to the Appointment.Start and Appointment.End properties.

docs.devexpress.com

2. Resource

여러 그룹으로 분리하여 일정 정보를 관리 해야 한다면,

분리된 그룹들을 Resource라고 보면 된다.

 

자세한 내용은 아래참조

https://docs.devexpress.com/WindowsForms/1756/controls-and-libraries/scheduler/appointments/resources-for-appointments

 

Resources for Appointments | WinForms Controls | DevExpress Documentation

A resource is an abstraction and its actual interpretation depends on a particular application. In a project schedule, a resource is an employee, and a vehicle in a car sharing service, etc. This document explains how to assign resources to appointments. O

docs.devexpress.com

3. 바인딩에 필요한 필수요소

schedulercontrol과 datatable을 연결하려면 아래 필수값이 있어야한다.

1. 시작날짜

2. 종료날짜 또는 소요기간

3. 일정에 대한 정보인 subject

4. Resource 별로 그룹화하기위한 ResourceId

 

 

개발시작

1. Resource DataTable 생성

   DataTable rscDt = new DataTable();
            rscDt.Columns.Add("user");
            rscDt.Rows.Add("베토벤");
            rscDt.Rows.Add("뉴턴");

일정 정보를 그룹화할 Resource 데이터를 만든다.

 

Resource의 DataTable은 아래 나오는 일정정보의 DataTable을 가공해서 만들어도 된다.

하지만 일정정보를 기반으로 생성하는 경우 일정정보가 없는 Resource는 화면에 표시되지 않음.

 

2. 일정 정보 DataTable 생성

샘플 데이터 테이블을 생성하자

  DataTable schDt = new DataTable();
            schDt.Columns.Add("user");
            schDt.Columns.Add("Todo");
            schDt.Columns.Add("StartDate",typeof(DateTime));
            schDt.Columns.Add("EndDate",typeof(DateTime));
            schDt.Columns.Add("NeedItems");

            schDt.Rows.Add("베토벤", "라면 끓이기", DateTime.Now, DateTime.Now.AddDays(3), "냄비,물,라면");
            schDt.Rows.Add("뉴턴", "삼두 하복근 4세트", DateTime.Now, DateTime.Now.AddDays(2), "종이,펜,아이패드");
            schDt.Rows.Add("뉴턴", "라면 훔쳐먹기", DateTime.Now.AddDays(4), DateTime.Now.AddDays(5), "젓가락");
            schDt.Rows.Add("베토벤", "뉴턴 고소하기", DateTime.Now.AddDays(6), Convert.ToDateTime("2024-12-17"), "진정서");

주의해야할 점은 시작일과 종료일 필드는 type정보를 선언해야 정상적으로 일정이 표기된다.

 

3. Control 추가(SchedulerControl, ResourceTree(선택사항))

4. Resource 바인딩

   private void BindResources()
        {
        	//resourceTree를 사용한다면 schedulerControl과 연결하기
        	resourcesTree1.SchedulerControl = schedulerControl1;    
            
            ISchedulerStorage ds = schedulerControl1.DataStorage;
            ds.Resources.DataSource = rscDt;
            ds.Resources.Mappings.Id = "user";
            ds.Resources.Mappings.Caption = "user";
            AddColumnResourcesTree();
        }
        /// <summary>
        /// ResourcesTree에 표기할 Column 추가
        /// </summary>
        private void AddColumnResourcesTree()
        {
            foreach (DataColumn col in rscDt.Columns)
            {
                TreeListColumn treeCol = new TreeListColumn();
                treeCol.Caption = col.Caption;
                treeCol.FieldName = col.ColumnName;
                treeCol.Visible = true;
                resourcesTree1.Columns.Add(treeCol);
            }
        }

 

이미지 처럼 Resource Tree를 사용한다면 ResourceTree의 컬럼정보도 추가해야 한다.

 

5. 일정정보(DataTable) 바인딩

        private void BindScheduler()
        {
            ISchedulerStorage ds = schedulerControl1.DataStorage;
            ds.Appointments.DataSource = schDt;
            ds.Appointments.Mappings.Start = "StartDate";
            ds.Appointments.Mappings.End = "EndDate";
            ds.Appointments.Mappings.Subject = "Todo";
            //ds.Appointments.Mappings.Description = "remark";
            ds.Appointments.CustomFieldMappings.Add(new AppointmentCustomFieldMapping("NeedItems", "NeedItems"));
            ds.Appointments.Mappings.ResourceId = "user";
        }

 

6. 기타 설정

        private void Form1_Load(object sender, EventArgs e)
        {
            schedulerControl1.GroupType = SchedulerGroupType.Resource;
        }

 

결과물 확인

 

샘플코드

포스팅한 소스와는 다르지만, 동일한 구조로 되어있음.

https://github.com/idleh4021/winform-devexpress-timelineview-based-datatable-Public

 

GitHub - idleh4021/winform-devexpress-timelineview-based-datatable-Public: DevExpress SchedulerControl을 사용한 timeLineView

DevExpress SchedulerControl을 사용한 timeLineView구현_Binding DataTable - GitHub - idleh4021/winform-devexpress-timelineview-based-datatable-Public: DevExpress SchedulerControl을 사용한 timeLineView구현_Bindi...

github.com

 

다음 포스팅에서는 그리드에 있는 데이터를 드래그앤드롭 하여 일정정보를 추가하는 기능을 구현할 예정이다.