public override void DrawHeaders(int firstVisibleCol, int lastVisibleCol, int controlWidth, Graphics graphics, Rectangle rect)
        {
            SolidBrush brush = new SolidBrush(SystemColors.ControlLight);
            Pen        pen   = new Pen(Color.LightGray);

            int columnStartX   = 0;
            int calendarStartX = 0;

            graphics.FillRectangle(brush, columnStartX + 1, 1, leftHeaderWidth, topHeaderHeight);
            graphics.DrawRectangle(pen, columnStartX + 1, 1, leftHeaderWidth, topHeaderHeight);

            columnStartX += leftHeaderWidth;  //첫 시작컬럼의 폭을 leftHeaderWidth 만큼 설정

            //주차 기간을 저장하기 위한 Dictionary - width 계산을 위해 필요
            Dictionary <int, List <int> > dicWeekNo = new Dictionary <int, List <int> >();
            //년월 기간을 저장하기 위한 Dictionary - width 계산을 위해 필요
            Dictionary <string, List <int> > dicYearMonth = new Dictionary <string, List <int> >();

            for (int i = firstVisibleCol; i <= lastVisibleCol; i++)
            {
                if (!this._headers[i].Visible)
                {
                    continue;
                }
                int headerWidth = this._headers[i].Width;   //i 번째 컬럼의 폭을 설정

                //보여지는 컬럼의 폭이 컨트롤의 폭 보다 클경우
                if (columnStartX + headerWidth > controlWidth)
                {
                    headerWidth = controlWidth - columnStartX - 3;
                    if (lastVisibleCol == (this._headers.Count - 1))
                    {
                        IsLargeLastCol = true;
                    }
                }
                else
                {
                    IsLargeLastCol = false;
                }

                YearMonthWeekNoDayHeader yearMonthHeader = this._headers[i] as YearMonthWeekNoDayHeader;
                if (yearMonthHeader.GetDateTime <= DateTime.MinValue)
                {
                    //Grid Header를 그린다.
                    DrawTextUtil.DrawGridHeaderRectangleAndText(graphics, brush, blackBrush, pen, this._headers, headerFont, i, columnStartX, headerWidth, topHeaderHeight);
                }
                else //Calendar 날짜 형태의 컬럼을 그리기 위한 사전 준비
                {
                    if (calendarStartX == 0)
                    {
                        calendarStartX = columnStartX;
                    }
                    //Calendar 날짜 형태의 컬럼 Header 그리기(일)
                    DrawTextUtil.DrawGridHeaderCalendarRectangleAndText(graphics, brush, blackBrush, pen, this._headers, headerFont, i, columnStartX, headerWidth);
                    if (!dicWeekNo.ContainsKey(yearMonthHeader.WeekNumber))
                    {
                        dicWeekNo.Add(yearMonthHeader.WeekNumber, new List <int>());
                    }
                    if (yearMonthHeader.Visible)
                    {
                        dicWeekNo[yearMonthHeader.WeekNumber].Add(yearMonthHeader.Width);
                    }
                    if (!dicYearMonth.ContainsKey(yearMonthHeader.YearMonth))
                    {
                        dicYearMonth.Add(yearMonthHeader.YearMonth, new List <int>());
                    }
                    if (yearMonthHeader.Visible)
                    {
                        dicYearMonth[yearMonthHeader.YearMonth].Add(yearMonthHeader.Width);
                    }
                }
                columnStartX += headerWidth;
            }
            //Calendar 날짜 형태의 컬럼 Header 그리기(주차/년월)
            DrawTextUtil.DrawGridHeaderCalendarWeekNumberRectangleAndText(graphics, brush, blackBrush, pen, headerFont, dicWeekNo, calendarStartX);
            DrawTextUtil.DrawGridHeaderCalendarYearMonthRectangleAndText(graphics, brush, blackBrush, pen, headerFont, dicYearMonth, calendarStartX);
        }