Esempio n. 1
0
        /// <summary>メンバーの作業時間の重複(エラー)または※2の時間を満たしていなければ警告
        /// </summary>
        private void CheckSpace()
        {
            CSchedule tsche = sdate[_member];
            CPattern  tpatt = tsche.Pattern;

            if (!(tpatt == null || tpatt.BuiltIn))
            {
                // 今日のシフトが存在する
                DateTime       today     = sdate.Date;
                DateTime       yesterday = today.AddDays(-1).Date;
                CScheduledDate ydate     = Root[yesterday];
                CSchedule      ysche     = ydate[_member];
                CPattern       ypatt     = ysche.Pattern;
                if (!(ypatt == null || ypatt.BuiltIn))
                {
                    // 昨日のシフトが存在する!
                    DateTime yend = yesterday + ypatt.End;
                    DateTime tend = yend + _member.Spacetime;
                    DateTime tstt = today + tpatt.Start;
                    if (yend >= tstt)
                    {
                        AddItem(EEvaluationResult.ERROR, GenerateMessage(msg_space_error, new string[] { _member.Name, tstt.ToString(), yend.ToString() }));
                    }
                    else if (tend > tstt)
                    {
                        AddItem(EEvaluationResult.WORNING, GenerateMessage(msg_space_worning, new string[] { _member.Name, tstt.ToString(), yend.ToString() }));
                    }
                }
            }
        }
Esempio n. 2
0
 /// <summary>勤務シフトを作成する
 /// </summary>
 /// <param name="member"></param>
 /// <param name="Span1"></param>
 /// <param name="Span2"></param>
 /// <param name="Rest"></param>
 private void CreatePattern (CMember member, TimeSpan Span1, TimeSpan Span2, TimeSpan Rest) {
     double dSpan1 = (long)(Span1.TotalHours / UMultiEditor.Threshold.TotalHours);
     double dSpan2 = (long)(Span2.TotalHours / UMultiEditor.Threshold.TotalHours);
     double dSpan3 = dSpan2 - dSpan1;
     CPattern newpattern = this.TimeTable.Patterns.CreatePattern();
     //newpattern.Name = "新しい作業用のシフト(" + dates[0].ToShortDateString() + (dates.Count <= 1 ? "" : "~" + dates[dates.Count - 1].ToShortDateString()) + ")";
     newpattern.Name = NewPatternName.Replace("%1", dates[0].ToShortDateString() + (dates.Count <= 1 ? "" : "~" + dates[dates.Count - 1].ToShortDateString()));
     newpattern.Start = TimeSpan.FromHours(dSpan1 * UMultiEditor.Threshold.TotalHours);
     newpattern.Scope = TimeSpan.FromHours(dSpan3 * UMultiEditor.Threshold.TotalHours);
     newpattern.Rest = Rest;
     newpattern.Notes = NewPatternNotes;
     newpattern.Created = dates[0];
     TimeTableManager.UI.FPatternDialog dialog = new TimeTableManager.UI.FPatternDialog();
     dialog.Pattern = newpattern;
     if (dialog.ShowDialog(MainForm) == DialogResult.OK) {
         TimeTable.Patterns.AddPattern(dialog.Pattern);
         foreach (DateTime date in dates) {
             if (date >= DateTime.Today) {
                 CScheduledDate sdate = TimeTable[date];
                 sdate[member].Pattern = dialog.Pattern;
             }
         }
         // 臨時用のみかどうか
         if (TimeTable.Patterns.Size() >= TimeTableManager.UI.FMainForm.MaxItemCount || MessageBox.Show(this.MainForm, CreatePatternMessage, CreatePatternTitle, MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button1) == DialogResult.Yes) {
             newpattern.SetAvailable(false, dates[dates.Count - 1]);
         }
     }
 }
Esempio n. 3
0
        /// <summary>チェック処理の実体
        /// </summary>
        /// <param name="bw"></param>
        private void RunCheck(BackgroundWorker bw)
        {
            if (mainForm == null)
            {
                return;
            }
            if (TimeTable == null)
            {
                return;
            }
            DateTime work = (LoopStart >= DateTime.Today ? LoopStart : DateTime.Today);

            while (work <= LoopEnd && bw.CancellationPending != true)
            {
                CScheduledDate sdate = TimeTable[work.Date];
                if (items.ContainsKey(sdate))
                {
                    CEvaluation1Day e1d = items[sdate];
                    e1d.Check();
                }
                else
                {
                    CEvaluation1Day e1d = new CEvaluation1Day(sdate);
                    items.Add(sdate, e1d);
                    e1d.Check();
                }
                work = work.AddDays(1);
                Thread.Sleep(10);
            }
            //
        }
Esempio n. 4
0
 /// <summary>メンバーの削除
 /// </summary>
 /// <param name="member">削除するメンバー</param>
 /// <param name="complete">完全削除かどうか</param>
 public virtual void DelMember(CMember member, bool complete)
 {
     if (!complete)
     {
         // 削除
         DelMember(member);
     }
     else
     {
         if (member.Removed != null)
         {
             members.Remove(member);
             //System.out.println("完全削除1:" + member.getName());
             // 完全削除
             int sz = parent.Size();
             for (int i = 0; i < sz; i++)
             {
                 //System.out.println("完全削除2:" + member.getName());
                 CScheduledDate sdate = parent[i];
                 sdate.MakeMembers();
             }
             if (TimeTable != null)
             {
                 TimeTable.NotifyMembersEdited(EnumTimeTableElementEventTypes.ElementRemoved, member);
             }
         }
         else
         {
             DelMember(member, false);
         }
     }
     Refresh();
 }
Esempio n. 5
0
        /// <summary>
        /// メンバーの作業時間の重複(エラー)または※2の時間を満たしていなければ警告
        /// </summary>
        private void CheckSpace()
        {
            CSchedule tsche = sdate[_member];
            CPattern  tpatt = tsche.Pattern;

            if (!(tpatt == null || tpatt.BuiltIn))
            {
                // 今日のパターンが存在する
                DateTime       today     = sdate.Date;
                DateTime       yesterday = today.AddDays(-1).Date;
                CScheduledDate ydate     = Root[yesterday];
                CSchedule      ysche     = ydate[_member];
                CPattern       ypatt     = ysche.Pattern;
                if (!(ypatt == null || ypatt.BuiltIn))
                {
                    // 昨日のパターンが存在する!
                    DateTime yend = yesterday + ypatt.End;
                    DateTime tend = yend + _member.Spacetime;
                    DateTime tstt = today + tpatt.Start;
                    if (yend >= tstt)
                    {
                        AddItem(EvaluationResult.ERROR, _member.Name + "の作業時間が重複しています。(" + tstt + "~" + yend + ")");
                    }
                    else if (tend > tstt)
                    {
                        AddItem(EvaluationResult.WARNING, _member.Name + "の作業間隔が不足しています。(" + yend + "~" + tstt + ")");
                    }
                }
            }
        }
 public CEvaluationItem(EvaluationResult Result, CScheduledDate Date, string Message)
 {
     id      = CEvaluationItem.NextID;
     result  = Result;
     sdate   = Date;
     message = Message;
 }
Esempio n. 7
0
        /// <summary>勤務シフトの終了を返す
        /// </summary>
        /// <param name="date"></param>
        /// <param name="member"></param>
        /// <param name="head"></param>
        /// <returns></returns>
        private string ReturnPatternEnd(DateTime date, CMember member, bool head)
        {
            if (head)
            {
                return(member.Name + "のシフト終了");
            }
            CScheduledDate sdate   = TimeTable[date];
            CSchedule      schdule = sdate[member];

            if (schdule == null)
            {
                return("");
            }
            CPattern pattern = schdule.Pattern;

            if (pattern == null)
            {
                return("");
            }
            if (pattern.BuiltIn)
            {
                return("");
            }
            DateTime ret = date.Date + pattern.End;

            return(ret.ToLongDateString() + " " + ret.ToLongTimeString());
        }
Esempio n. 8
0
        /// <summary>勤務シフトの長さを返す
        /// </summary>
        /// <param name="date"></param>
        /// <param name="member"></param>
        /// <param name="head"></param>
        /// <returns></returns>
        private string ReturnPatternLength(DateTime date, CMember member, bool head)
        {
            if (head)
            {
                return(member.Name + "の勤務時間");
            }
            CScheduledDate sdate   = TimeTable[date];
            CSchedule      schdule = sdate[member];

            if (schdule == null)
            {
                return(TimeSpan.Zero.ToString());
            }
            CPattern pattern = schdule.Pattern;

            if (pattern == null)
            {
                return(TimeSpan.Zero.ToString());
            }
            if (pattern.BuiltIn)
            {
                return(TimeSpan.Zero.ToString());
            }
            return(pattern.Scope.ToString());
        }
Esempio n. 9
0
 /// <summary>値のセット
 /// </summary>
 /// <param name="sender">イベントの発生したオブジェクト</param>
 /// <param name="e">発生したイベント</param>
 private void BodyTable_CellValuePushed (object sender, DataGridViewCellValueEventArgs e) {
     CMember member = Members[e.RowIndex];
     switch (e.ColumnIndex) {
         case 0:
             break;
         case 1:
             if (this.TimeTable == null) return;
             CPattern pattern = e.Value as CPattern;
             if (pattern == CPattern.MULTI) return;
             foreach (DateTime date in Dates) {
                 if (date >= DateTime.Today) {
                     CScheduledDate sdate = this.TimeTable[date];
                     CSchedule sche = sdate[member];
                     sche.Pattern = pattern;
                 }
             }
             SetUpMember2Pattern(member);
             break;
         case 2:
             if (Dates.Count == 1 && StartDate >= DateTime.Today) {
                 string val = e.Value as string;
                 if (val == null) val = "";
                 if (this.TimeTable != null) {
                     DateTime date = StartDate;
                     CScheduledDate sdate = this.TimeTable[date];
                     CSchedule sche = sdate[member];
                     sche.Notes = val;
                     //sche.SetProperty("notes", val);
                     this.timeTable.NotifyScheduleEdited(sche);
                     SetUpMember2Pattern(member);
                 }
             }
             break;
     }
 }
Esempio n. 10
0
 /// <summary>メンバーの就業状態の作成
 /// </summary>
 /// <param name="member"></param>
 private void SetUpMember2Pattern (CMember member) {
     PatternWrapper wrapper = new PatternWrapper();
     wrapper.Pattern = CPattern.NULL;
     wrapper.StartTime = TimeSpan.MaxValue;
     wrapper.EndTime = TimeSpan.MinValue;
     if ((member == null) || (Dates.Count <= 0) || (TimeTable == null)) {
         // 存在しない
         if (member != null && Member2PatternWrapper.ContainsKey(member)) {
             Member2PatternWrapper.Remove(member);
         }
         return;
     } else {
         // 繰り返し
         int i = 0;
         foreach (DateTime date in Dates) {
             CScheduledDate sdate = TimeTable[date];
             CSchedule schedule = sdate[member];
             CPattern work = schedule.Pattern;
             if (i == 0) {
                 // 最初のシフト
                 wrapper.Pattern = work;
                 if (work != null && !work.BuiltIn) {
                     wrapper.StartTime = work.Start;
                     wrapper.EndTime = work.End;
                     i++;
                 }
                 wrapper.Notes = schedule.Notes;
                 //wrapper.Notes = schedule["notes"];
             } else if (wrapper.Pattern != work) {
                 if (schedule.Notes != "") {
                     // メモの追加
                     wrapper.Notes += "," + schedule.Notes;
                 }
                 // 複数選択されている
                 wrapper.Pattern = CPattern.MULTI;
                 if (work != null && !work.BuiltIn) {
                     if (wrapper.StartTime > work.Start) {
                         wrapper.StartTime = work.Start;
                     }
                     if (wrapper.EndTime < work.End) {
                         wrapper.EndTime = work.End;
                     }
                 }
                 i++;
             }
             
         }
         // 追加する
         if (Member2PatternWrapper.ContainsKey(member)) {
             Member2PatternWrapper[member] = wrapper;
         } else {
             Member2PatternWrapper.Add(member, wrapper);
         }
     }
 }
Esempio n. 11
0
        /// <summary>日付のロード
        /// </summary>
        public void LoadScheduledDate(XmlElement element, CTimeTable all)
        {
            DateTime       date          = DateTime.Parse(element.GetAttribute("date"));
            CScheduledDate scheduleddate = all.Dates.CreateScheduledDate(date);

            if (date.Year == 2007 && date.Month == 4 && date.Day == 28)
            {
                System.Console.WriteLine("ここだ!");
            }
            LoadTmElement(element, scheduleddate);
            XmlAttribute req = element.Attributes["require"];

            // 人員配置
            if (req != null)
            {
                int wid = int.Parse(req.Value);
                CRequirePatterns reqobj = all.Requires.GetByID(wid);
                scheduleddate.Require = reqobj;
            }
            else
            {
                scheduleddate.Require = CRequirePatterns.NULL;
            }
            XmlElement pNode = element.FirstChild as XmlElement;

            while (pNode != null)
            {
                if (pNode.Name == "schedule")
                {
                    // スケジュール
                    CSchedule schedule = scheduleddate.CreateSchedule();
                    LoadTmElement(pNode, schedule);
                    string membertxt = pNode.GetAttribute("member");
                    if (membertxt.Trim().Length > 0)
                    {
                        int memberid = int.Parse(membertxt);
                        if (memberid > 0)
                        {
                            schedule.Member = all.Members.GetByID(memberid);
                        }
                    }
                    string patterntxt = pNode.GetAttribute("pattern");
                    if (patterntxt.Trim().Length > 0)
                    {
                        int patternid = int.Parse(patterntxt);
                        schedule.Pattern = all.Patterns.GetByID(patternid);
                    }
                    scheduleddate.SetSchedule(schedule);
                }
                //
                pNode = pNode.NextSibling as XmlElement;
            }
            all.Dates.AddScheduleDate(scheduleddate);
        }
Esempio n. 12
0
        /// <summary>人員配置名を返す
        /// </summary>
        /// <param name="date"></param>
        /// <param name="member"></param>
        /// <param name="head"></param>
        /// <returns></returns>
        private string ReturnRequireName(DateTime date, CMember member, bool head)
        {
            if (head)
            {
                return("人員配置");
            }
            CScheduledDate   sdate = TimeTable[date];
            CRequirePatterns rq    = sdate.Require;

            if (rq == null)
            {
                return("");
            }
            return(ConvertColumn(rq.Name));
        }
        /// <summary>IDによるスケジュール日の取得
        /// </summary>
        /// <param name="index">ID</param>
        /// <returns>スケジュール日</returns>
        public virtual CScheduledDate GetByID(int index)
        {
            DateTime       datetime = new DateTime(index / 10000, (index % 10000) / 100, index % 100);
            CScheduledDate work     = new CScheduledDate(datetime, this.TimeTable);
            //work.ObjectID = index;
            int i = schedules.BinarySearch(work);

            if (i < 0)
            {
                work = CreateScheduledDate(datetime);
                AddScheduleDate(work);
                return(work);
            }
            return((CScheduledDate)schedules[i]);
        }
        /// <summary>メンバーの削除
        /// </summary>
        /// <param name="member">削除するメンバー</param>
        /// <param name="date">削除する日</param>
        public void ClearMember(CMember member, DateTime date)
        {
            CScheduledDate work = CreateScheduledDate(date);
            int            i    = schedules.BinarySearch(work);

            if (i < 0)
            {
                return;
            }
            for (int j = i; j < schedules.Count; j++)
            {
                CScheduledDate sdate    = schedules[j];
                CSchedule      schedule = sdate[member];
                schedule.Pattern = null;
            }
        }
        /// <summary>スケジュール日の取得
        /// </summary>
        /// <param name="n">日付</param>
        /// <returns>スケジュール日</returns>
        private CScheduledDate GetScheduledDate(DateTime n)
        {
            CScheduledDate retValue = null;


            int index = n.Year * 10000 + n.Month * 100 + n.Day;

            retValue = GetByID(index);

            if (retValue == null)
            {
                retValue = CreateScheduledDate(n);
                AddScheduleDate(retValue);
            }
            return(retValue);
        }
Esempio n. 16
0
        /// <summary>勤務シフト名を返す
        /// </summary>
        /// <param name="date"></param>
        /// <param name="member"></param>
        /// <param name="head"></param>
        /// <returns></returns>
        private string ReturnPatternName(DateTime date, CMember member, bool head)
        {
            if (head)
            {
                return(member.Name + "の勤務シフト");
            }
            CScheduledDate sdate   = TimeTable[date];
            CSchedule      schdule = sdate[member];

            if (schdule == null)
            {
                return("");
            }
            CPattern pattern = schdule.Pattern;

            if (pattern == null)
            {
                return("");
            }
            return(ConvertColumn(pattern.Name));
        }
Esempio n. 17
0
 /// <summary>日付のセーブ
 /// </summary>
 public void SaveScheduledDate(XmlDocument doc, XmlElement rNode, CTimeTable all)
 {
     for (int i = 0; i < all.Size(); i++)
     {
         bool           edited = false;
         CScheduledDate sdate  = all[i];
         XmlElement     pNode  = doc.CreateElement("scheduleddate");
         SaveTmElement(doc, pNode, sdate);
         // 日付がもっとも大事?
         pNode.SetAttribute("date", sdate.Date.ToString(CSaver.DATEFORMAT));
         // 人員配置
         if (sdate.Require != null && sdate.Require != CRequirePatterns.NULL)
         {
             pNode.SetAttribute("require", sdate.Require.ObjectID.ToString());
             if (sdate.Require != all.GetDefaultRequire(sdate.Date.DayOfWeek))
             {
                 edited = true;
             }
         }
         // メンバーごとのスケジュール(シフトとメモ)
         for (int j = 0; j < sdate.ValidMemberSize; j++)
         {
             CSchedule  schedule = sdate[j];
             XmlElement nNode    = doc.CreateElement("schedule");
             SaveTmElement(doc, nNode, schedule);
             if ((schedule.Member != null && schedule.Member != CMember.NULL && schedule.Pattern != null && schedule.Pattern != CPattern.NULL) || (schedule.Notes.Trim() != ""))
             {
                 nNode.SetAttribute("member", schedule.Member.ObjectID.ToString());
                 nNode.SetAttribute("pattern", schedule.Pattern.ObjectID.ToString());
                 edited = true;
                 pNode.AppendChild(nNode);
             }
         }
         if (edited)
         {
             // 変更されている場合のみ
             rNode.AppendChild(pNode);
         }
     }
 }
        /// <summary>値設定
        /// </summary>
        /// <param name="sender">イベントの発生したオブジェクト</param>
        /// <param name="e">発生したイベント</param>
        private void CalenderView_CellValuePushed(object sender, DataGridViewCellValueEventArgs e)
        {
            if (TimeTable == null)
            {
                return;
            }
            DateTime date = GetDateFromRowIndex(e.RowIndex);

            if (e.ColumnIndex == 0)
            {
                // 日付
                //e.Value = date;
            }
            else
            {
                CScheduledDate sdate = TimeTable[date];
                if (e.ColumnIndex == 1)
                {
                    // 人員配置
                    sdate.Require = e.Value as CRequirePatterns;
                }
                else
                {
                    // メンバー||シフト
                    int index = e.ColumnIndex - 2;
                    if (index < columns1.Count)
                    {
                        ShiftComboBoxColumn col    = columns1[index];
                        CMember             member = col.Member;
                        if (member != null)
                        {
                            CSchedule schedule = sdate[member];
                            schedule.Pattern = e.Value as CPattern;
                        }
                    }
                }
            }
        }
Esempio n. 19
0
 /// <summary>勤務シフトの完全削除
 /// </summary>
 /// <param name="pattern">削除するシフト</param>
 /// <param name="complete">完全に削除するかどうか</param>
 public virtual void  DelPattern(CPattern pattern, bool complete)
 {
     if (!complete)
     {
         DelPattern(pattern);
     }
     else
     {
         // 完全に削除する
         if (pattern.Removed != null)
         {
             patterns.Remove(pattern);
             // スケジュールから削除
             int sz = parent.Size();
             for (int i = 0; i < sz; i++)
             {
                 CScheduledDate wkDate = parent[i];
                 int            sz2    = wkDate.ValidMemberSize;
                 for (int j = 0; j < sz2; j++)
                 {
                     CSchedule scd = wkDate[j];
                     if (scd != null)
                     {
                         CPattern pat = scd.Pattern;
                         if (pat != null && pat.Equals(pattern))
                         {
                             scd.Pattern = CPattern.NULL;
                         }
                     }
                 }
             }
             if (TimeTable != null)
             {
                 TimeTable.NotifyPatternsEdited(EnumTimeTableElementEventTypes.ElementRemovedForce, pattern);
             }
         }
     }
 }
        /// <summary>スケジュール日の作成</summary>
        protected internal virtual CScheduledDate CreateScheduledDate(System.DateTime d)
        {
            CScheduledDate ret = new CScheduledDate(d, TimeTable);

            if (this.TimeTable.IsDayOff(d))
            {
                ret.Require = CRequirePatterns.DAYOFF;
            }
            else
            {
                if (this.TimeTable.GetDefaultRequire(d.DayOfWeek) != null)
                {
                    ret.Require = this.TimeTable.GetDefaultRequire(d.DayOfWeek);
                }
                else
                {
                    if (this.TimeTable.DefaultRequire != null)
                    {
                        ret.Require = this.TimeTable.DefaultRequire;
                    }
                }
            }
            return(ret);
        }
Esempio n. 21
0
 /// <summary>
 /// コンストラクタ
 /// </summary>
 /// <param name="sDate"></param>
 public CEvaluation1Day(CScheduledDate sDate)
 {
     this.sdate = sDate;
     Check();
 }
 public EScheduleDateRequirePatternsEditedEventArgs(CScheduledDate param0, CRequirePatterns param1)
 {
     this.sdate   = param0;
     this.require = param1;
 }
 /// <summary>
 /// コンストラクタ
 /// </summary>
 /// <param name="source"></param>
 public ECurrentDateChangedArgs(CScheduledDate source)
 {
     this.scheduleDate = source;
 }
 /// <summary>スケジュール日の削除
 /// </summary>
 /// <param name="d">削除するスケジュール日</param>
 public virtual void DelScheduledDate(CScheduledDate d)
 {
     schedules.Remove(d);
 }
 /// <summary>スケジュール日の追加</summary>
 protected internal virtual void AddScheduleDate(CScheduledDate sd)
 {
     schedules.Add(sd);
     //schedules.Sort();
     Sort2();
 }
Esempio n. 26
0
        /// <summary>印刷・ボディ部分
        /// </summary>
        /// <param name="g">グラフィックスオブジェクト</param>
        /// <param name="e">イベント</param>
        protected virtual void PaintBody(Graphics g, System.Drawing.Printing.PrintPageEventArgs e)
        {
            //Graphics g = e.Graphics;
            Rectangle  mar = e.MarginBounds;
            RectangleF rect;

            #region 内部の箱
            {
                float itop    = mar.Top + Header.GetHeight(g);
                float ibottom = mar.Bottom - Footer.GetHeight(g) - 2;
                float iheight = ibottom - itop;
                float ileft   = mar.Left;
                float iwidth  = mar.Width;
                float iright  = ileft + iwidth;
                rect = new RectangleF(ileft, itop, iwidth, iheight);
            }
            #endregion
            //
            g.DrawRectangle(this.Pen, rect.Left, rect.Top, rect.Width, rect.Height);
            //
            CPageIndex page = pages[index];
            // 決め打ちできる罫線を引く
            float DateRight = rect.Left + RequireColumnWidth;
            g.DrawLine(this.Pen, DateRight, rect.Top, DateRight, rect.Bottom);
            DrawString(g, "日付", HeaderFont, HeaderBrush, rect.Left, DateRight, rect.Top, tableHeaderHight, EPrintMargin.MARGIN_CENTER, EPrintMargin.MARGIN_CENTER);
            float RequireRight = DateRight;
            if (IsDisplayRequire)
            {
                RequireRight += RequireColumnWidth;
                g.DrawLine(this.Pen, RequireRight, rect.Top, RequireRight, rect.Bottom);
                DrawString(g, "人員配置", HeaderFont, HeaderBrush, DateRight, RequireRight, rect.Top, tableHeaderHight, EPrintMargin.MARGIN_CENTER, EPrintMargin.MARGIN_CENTER);
            }
            // テーブルのヘッダ
            float TableHeadBottom = rect.Top + TableHeaderHight;
            g.DrawLine(this.Pen, rect.Left, TableHeadBottom, rect.Right, TableHeadBottom);
            // メンバー数に応じた罫線を引く
            float MemberColumnBase  = (IsDisplayRequire ? RequireRight : DateRight);
            float MemberColumnSpace = rect.Right - MemberColumnBase;
            float MemberColumnWidth = MemberColumnSpace / page.MemberCount;
            for (int i = 1; i < page.MemberCount; i++)
            {
                float WorkLeft  = MemberColumnBase + MemberColumnWidth * (i - 1);
                float WorkRight = MemberColumnBase + MemberColumnWidth * i;
                g.DrawLine(this.Pen, WorkRight, rect.Top, WorkRight, rect.Bottom);
            }
            // メンバー名
            for (int i = 0; i < page.MemberCount; i++)
            {
                float WorkLeft  = MemberColumnBase + MemberColumnWidth * i;
                float WorkRight = MemberColumnBase + MemberColumnWidth * (i + 1);
                //
                CMember member = this.TimeTable.Members[page.MemberStartIndex + i];
                DrawString(g, member.Name, HeaderFont, HeaderBrush, WorkLeft, WorkRight, rect.Top, tableHeaderHight, EPrintMargin.MARGIN_CENTER, EPrintMargin.MARGIN_CENTER);
            }
            // 日数に応じた罫線を引く
            float DateRowSpace  = rect.Bottom - TableHeadBottom;
            float DateRowHeight = DateRowSpace / page.DateCount;
            for (int i = 1; i < page.DateCount; i++)
            {
                float WorkTop    = TableHeadBottom + DateRowHeight * (i - 1);
                float WorkBottom = TableHeadBottom + DateRowHeight * i;
                g.DrawLine(this.Pen, rect.Left, WorkBottom, rect.Right, WorkBottom);
            }
            // これこそ本体
            DateTime WorkDate = page.Start;
            for (int i = 0; i < page.DateCount; i++)
            {
                float WorkTop    = TableHeadBottom + DateRowHeight * i;
                float WorkBottom = TableHeadBottom + DateRowHeight * (i + 1);
                // 日付
                DrawString(g, WorkDate.ToString(DateFormat), System.Windows.Forms.Control.DefaultFont, Brushes.Black, rect.Left, DateRight, WorkTop, DateRowHeight, EPrintMargin.MARGIN_CENTER, EPrintMargin.MARGIN_CENTER);
                // スケジュール日
                CScheduledDate sdate = this.TimeTable[WorkDate];
                if (IsDisplayRequire)
                {
                    if (sdate.Require != null)
                    {
                        DrawString(g, sdate.Require.Name, BodyFont, BodyBrush, DateRight, RequireRight, WorkTop, DateRowHeight, EPrintMargin.MARGIN_CENTER, EPrintMargin.MARGIN_CENTER);
                    }
                }
                // シフト
                for (int j = 0; j < page.MemberCount; j++)
                {
                    float WorkLeft  = MemberColumnBase + MemberColumnWidth * j;
                    float WorkRight = MemberColumnBase + MemberColumnWidth * (j + 1);
                    //
                    CMember   member   = this.TimeTable.Members[page.MemberStartIndex + j];
                    CSchedule schedule = sdate[member];
                    CPattern  pattern  = (schedule != null ? schedule.Pattern : null);
                    if (pattern != null)
                    {
                        DrawString(g, pattern.Name, BodyFont, BodyBrush, WorkLeft, WorkRight, WorkTop, DateRowHeight, EPrintMargin.MARGIN_CENTER, EPrintMargin.MARGIN_CENTER);
                    }
                }
                //
                WorkDate = WorkDate.AddDays(1);
            }
            //
            e.HasMorePages = page.HasMorePage;
            //
            index++;
        }