반응형

지금까지는 기본적인 Grid 기본 기능을 DefaultHeader와 DefaultHeaderGenerator를 이용해서 구현했다.

기본 Grid 기능에 Calendar 정보를 해서 일정계획을 세울 수 있는 GridType을 새롭게 정의해서 개발을 해보고자 한다.

아래의 이미지와 같이 좌측의 일반적인 Grid 정보와 함께 우측에는 특정 기간까지의 일자 정보를 추가해서 일정계획을 세울 수 있도록 기능을 제공할 수 있는 GridType을 같이 만들어 보고자 한다.

새로운 GridType을 추가 하기 위해 필요한 사전 작업들을 하나씩 살펴보면서 구현을 해보자.

[그림 22-1] 새로운 유형의 GridType

먼저 위 화면에서 보이는 Calendar 셀들은 시작일자와 종료일자를 입력받아서 일자 셀(Cell)의 기본 폭(Width)을 10으로 설정해서 일/주차/년월 정보를 헤더로 제공해야 한다.

또한 Calendar 셀에서 데이터 입력과 같은 작업은 할 수 없도록 제어한다.

최종적으로는 시작일자와 종료일자를 기준으로 특정 심볼(Symbol)을 이용해서 Activity 또는 과제를 Calendar 셀 위에 생성/추가해서 화면 상에 표시하고, 이렇게 표기된 심볼을 이동하거나 길이를 조정해서 일정 계획을 세울 수 있도록 할 예정이다.

 

HeaderBuilder클래스의 AddHeader를 통해서 표기해야 할 컬럼헤더를 생성한다. 위의 그림 기준으로 보면 Column 01~04까지의 컬럼이 되겠다.

HeaderBuilder 클래스의 StartDate/FinishDate 속성 값을 설정하면 설정된 시작일자와 종료일자까지 Calendar 셀을 자동으로 생성하도록 하면 된다.

 

추가 되는 일자 정보관리를 위해서 기존의 Class파일 들을 하나씩 살펴보고 추가/보완해 보기로 하자.

먼저 Header.cs 파일을 살펴보자.

날짜 정보만 관리하게 되는 컬럼이 추가로 생성되다 보니 기존의 사용자 또는 개발자가 AddHeader로 생성한 컬럼과 구별하기 위한 값이 필요하게 된다. 즉 Calendar 정보가 저장된 컬럼임을 식별할 수 있는 변수와 속성 값이 필요하게 된다.

Header.cs 파일에 isDate 변수와 IsDate 속성을 추가하도록 한다.

 

    private bool isDate = false;    //Calendar를 그리기 위한 날짜 정보인지 여부

 

    public bool IsDate
    {
        get { return isDate; }
        set { isDate = value; }
    }

 

기존 속성 중 Width 속성의 제한 폭을 10에서 5로 하향 조정한다. 이는 Control키와 플러스(+)/마이너스(-)키를 눌러서 Calender컬럼들의 폭을 키우거나 줄일 경우 최소값을 5로 조정한다. 즉 5이하로는 더 이상 폭이 줄지 않도록 제어하는 역할을 하게 된다.

 

    public int Width
    {
        get { return width; }
        set
        {
            if (value < 5)
                width = 5;
            else
                width = value;
            OnWidthResized();
        }
    }

 

HeaderGenerator.cs 파일을 살펴보자.

GridType.cs 파일을 보면 DefaultType/YearMonthWeekNoType/YearMonthWeekNoDayType 이렇게 3개가 존재한다.

  • DefaultType - 기본 Grid 유형으로 일반적인 Grid Control의 기능만을 제공하는 유형이다.
  • YearMonthWeekNoType - 기본 Grid 유형 + 주차/년월 Calendar 정보를 제공하는 유형이다.
  • YearMonthWeekNoDayType - 기본 Grid 유형 + 일/주차/년월 Calendar 정보를 제공하는 유형이다.

HeaderGenerator 클래스 생성 시에 위의 3가지 유형 값을 설정할 수 있는 변수와 속성을 추가한다.

기본 값은 GridType.DefaultType이다.

    protected GridType gridDisplayType = GridType.DefaultType;

 

    public GridType GridDisplayType
    {
        get { return gridDisplayType; }
        set { gridDisplayType = value; }
    }

 

HeaderGenerator 클래스의 메소드 중 고정컬럼이 설정되었을 경우 기존에 호출되는 DrawHeaders 메소드의 파라미터를 1개 더 추가한다. 추가된 파라미터 fixedColEditable 변수는 고정컬럼의 수정 여부를 설정할 수 있는 bool 값이다.

고정 컬럼의 경우 수정을 할 수 없도록 설정이 필요하거나 할 경우 bool 값을 파라미터로 던져주게 된다.

true일 경우 수정이 가능하고, false의 경우 수정을 할 수 없도록 기능을 막게 된다.

    public abstract void DrawHeaders(int colFixed, int firstVisibleCol, int lastVisibleCol, int controlWidth, Graphics graphics,

                                                 Rectangle rect, bool fixedColEditable);

 

WANIGrid의 Header영역을 정의하는 기본 적인 클래스들에 대해서 변경 또는 보완해야 하는 부분들에 대해서 간단히 리뷰를 했다.

앞서 재정의한 Header 영역을 상속 받아서 구현해야 하는 YearMonthWeekNoDayHeader.cs와 YearMonthWeekNoDayHeaderGenerator.cs 파일을 살펴 보기로 하자

WANIGrid 프로젝트 > Head 폴더 아래에서 우측 마으스 버튼을 눌러서 추가 > 클래스를 선택한다.

클래스 이름을 YearMonthWeekNoDayHeader로 한다. 

[그림 22-2] 새로운 클래스 추가

YearMonthWeekNoDayHeader클래스는 기본적으로 Header클래스를 상속받아서 추상 메소드를 모두 구현하고 Header클래스에 없는 변수와 속성을 추가로 정의해야 한다.

먼저 추가해야 하는 변수부터 살펴 보기로 하자.

    private DateTime dateTime;  //헤더(Column)가 Calendar 날짜를 저장하고 있는 영역일 경우 DateTime 값을 가지게 됨
    private int weekNumber; //DateTime 값을 가지고 있으면 현 날짜의 주차 정보를 저장하기 위한 변수
    private string yearMonth;   //DateTime 값을 가지게 되면 년/월 값을 저장하기 위한 변수
    private bool isHoliday = false; //휴일 유무에 대한 bool 값을 저장
    private string pattern = ".";   //년월 구분자 (예. "." : 2019.09, "-" : 2019-09)

 

그리고 상단의 변수를 외부와 연결하기 위한 속성(Property)을 살펴보자

    /// <summary>
    /// DateTime 값을 반환. 외부에서 지정 불가.
    /// </summary>
    public DateTime GetDateTime
    {
        get { return dateTime; }
    }

    /// <summary>
    /// DateTime에 해당하는 주차 정보를 반환. 외부에서 지정 불가.
    /// </summary>
    public int WeekNumber
    {
        get { return weekNumber; }
    }

    /// <summary>
    /// DateTime에 해당하는 년월 정보를 반환. 외부에서 지정 불가
    /// </summary>
    public string YearMonth
    {
        get { return yearMonth; }
    }

    /// <summary>
    /// 휴일 여부를 반환
    /// </summary>
    public bool IsHoliday
    {
        get
        {
            //토,일을 휴일로 지정. 지정 휴일일 경우 isHoliday를 true로 설정하면 됨.
            if (dateTime.DayOfWeek == DayOfWeek.Saturday || dateTime.DayOfWeek == DayOfWeek.Sunday) isHoliday = true;
            return isHoliday;
        }
        set { isHoliday = value; }
    }

    /// <summary>
    /// 년과 월사이의 구분 기호를 가져오거나 설정한다.
    /// </summary>
    public string Pattern
    {
        get { return pattern; }
        set { pattern = value; }
    }

 

통상적인 컬럼(Column)들일 경우에는 DefaultHeader클래스를 참고해서 생성자 부분을 구현해서 처리하도록 하고, 특정 기간 동안의 Calendar 정보를 기반으로 만들어져야 하는 컬럼(Column)의 경우에는 생성자에서 특정 파라미터 값을 받아서 Header정보를 생성할 수 있도록 처리한다.

DefaultHeader 클래스에 존재하는 생성자외에 Calendar 정보를 기반으로 만들어지는 Header 정보의 생성자만 살펴보기로 하자.

파라미터 값으로는 DateTime과 주차 정보인 DayOfWeek 값을 받아서 처리한다.

    public YearMonthWeekNoDayHeader(DateTime dt, DayOfWeek dayOfWeek)
    {
        this.ColumnId = dt.ToString("yyyyMMdd");
        int day = dt.Day;
        string strDay = "";
        if (day < 10) strDay = "0" + day;
        else strDay = day.ToString();
        this.Title = strDay;  //Title 값으로 날짜를 2자리 형태로 출력. (01, 02 ... 11, 12 등)
        this.Width = 10; //폭(Width : 10으로 지정)
        this.HeadAlign = HorizontalAlignment.Center; //헤더 텍스트 정렬 - 중앙
        this.TextAlign = HorizontalAlignment.Center; //컨텐츠 텍스트 정렬 - 중앙
        this.Visible = true;
        this.dateTime = dt; //dt 정보를 저장
        this.weekNumber = DateUtil.GetWeekNumber(dt, dayOfWeek); //주차 정보
        string strMonth = "";
        if (dt.Month < 10) strMonth = "0" + dt.Month;
        else strMonth = dt.Month.ToString();
        this.yearMonth = dt.Year + pattern + strMonth; //년월 정보 사이에 pattern 추가
        this.Editable = false; //Cell 내용 편집 불가
        this.IsDate = true;  //Calendar 유형 셀이기에 isDate 값을 true로 설정
    }  

입력 받은 시작일자와 종료일자를 바탕으로 Calendar 기반의 일자 컬럼을 생성하는 생성자를 살펴 보았다.

 

여기까지는 일반 컬럼과 Calendar 타입의 컬럼들의 Header 정보를 생성하는 클래스들 중심으로 살펴 보았다.

다음에는 생성된 일반 컬럼과 Calendar 타입의 컬럼들의 정보로 실제 WANIGrid의 모습을 그리기 위해 Header영역을 그리는 클래스인 YearMonthWeekNoDayHeaderGenerator클래스와 함께 Body 영역을 그리는 부분을 같이 살펴보기로 하자.

 

 

반응형

+ Recent posts