/// <summary>
        /// ルールの削除を実行します
        /// </summary>
        /// <param name="target">削除する対象のルール</param>
        private void DeleteOtherMonthsRules(RepeatRule target)
        {
            // 今月よりも先のルールを匿名型(person, date)の形式でリストする。
            var plist = StandbyLists.Where(sl => new DateTime(sl.Year, sl.Month, DateTime.DaysInMonth(sl.Year, sl.Month)) > new DateTime(Year, Month, DateTime.DaysInMonth(Year, Month))).Select(st => new { person = st.Persons.FirstOrDefault(p => p.ID == Person.ID), date = new DateTime(st.Year, st.Month, 1) });
            // 今月よりも前のルールを匿名型(person, date)の形式でリストする。
            var blist = StandbyLists.Where(li => new DateTime(li.Year, li.Month, 1) < new DateTime(Year, Month, 1)).Select(st => new { person = st.Persons.FirstOrDefault(p => p.ID == Person.ID), date = new DateTime(st.Year, st.Month, 1) });
            var tdays = target.GetDays(Year, Month);

            tdays.AddRange(getBAMonthsAffairDays(Year, Month, target));
            tdays.Where(tday => tday > 0 && DateTime.DaysInMonth(Year, Month) >= tday).ToList().ForEach(tday =>
            {
                // 現在対象の個人のRepeatRuleを書き換え
                var tdate = new DateTime(Year, Month, tday);
                if (!CheckTargetDate(Year, Month, tday))
                {
                    Person[tdate] = PossibleDays.Status.None;
                }
            });
            // 今月より前のルールの終了日(End)を書き換える
            blist.ToList().ForEach(b =>
            {
                if (b.person == null)
                {
                    return;
                }
                var findtarget = b.person.Requirement.RepeatRule.Find(f => f == target);
                if (findtarget != null)
                {
                    findtarget.End = new DateTime(Year, Month, 1).AddDays(-1);
                }
            });
            // 今月より先のルールを削除し、不都合日を削除する
            plist.ToList().ForEach(p =>
            {
                if (p.person == null)
                {
                    return;
                }
                p.person.Requirement.RepeatRule.Remove(target);
                var days = target.GetDays(p.date.Year, p.date.Month);
                days.Where(day => day > 0 && DateTime.DaysInMonth(p.date.Year, p.date.Month) >= day).ToList().ForEach(day =>
                {
                    var tdate = new DateTime(p.date.Year, p.date.Month, day);
                    if (!CheckTargetDate(tdate.Year, tdate.Month, day))
                    {
                        p.person[tdate] = PossibleDays.Status.None;
                    }
                });
            });
            // 個人のRepeatRuleリストからルールを削除します
            Person.Requirement.RepeatRule.Remove(target);
        }
        private void dgvRule_SelectionChanged(object sender, EventArgs e)
        {
            DataGridView dgview = sender as DataGridView;

            if (dgview.SelectedRows.Count > 0)
            {
                RepeatRule rule = dgview.SelectedRows[0].Tag as RepeatRule;
                var        days = rule.GetDays(Year, Month);
                days.AddRange(getBAMonthsAffairDays(Year, Month, rule));

                calendar1.GetSchedules().ForEach(s => {
                    if (s.BackColor != Setting.DutyFieldColor)
                    {
                        s.BackColor = Setting.DutyFieldColor;
                    }
                    if (s.Item != null)
                    {
                        if (days.Any(t => t == s.Start.Day))
                        {
                            s.BackColor = Setting.DutyHilightColor;
                        }
                    }
                });
            }
        }
        /// <summary>
        /// 前後の月の不都合日を検索して、今月の不都合日に設定すべき日を取得します
        /// </summary>
        /// <param name="Year">不都合日を取得する対象の年</param>
        /// <param name="Month">不都合日を取得する対象の月</param>
        /// <param name="rule">不都合日を設定するルールを格納したRepeatRuleオブジェクト</param>
        /// <returns></returns>
        private List <int> getBAMonthsAffairDays(int Year, int Month, RepeatRule rule)
        {
            var days      = new List <int>();
            var nextmonth = new DateTime(Year, Month, DateTime.DaysInMonth(Year, Month)).AddDays(1);
            var prevmonth = new DateTime(Year, Month, 1).AddDays(-1);
            var eprevdays = rule.GetDays(prevmonth.Year, prevmonth.Month).Where(t =>
            {
                return(t > DateTime.DaysInMonth(prevmonth.Year, prevmonth.Month));
            }).Select(t =>
            {
                return(new DateTime(prevmonth.Year, prevmonth.Month, 1).AddDays(t - 1).Day);
            });

            var enextdays = rule.GetDays(nextmonth.Year, nextmonth.Month).Where(t => t < 1).Select(t => nextmonth.AddDays(t - 1).Day);

            days.AddRange(eprevdays);
            days.AddRange(enextdays);
            return(days);
        }
        private void DeleteFromCalendar(RepeatRule target)
        {
            // dgvRuleで選択中のRowとそれに対応するRuleを削除する
            dgvRule.Rows.Remove(dgvRule.SelectedRows[0]);
            // 現在表示中のカレンダーの不都合日表示のみ削除する。(実際に削除するのはダイアログがOKされた時)
            var pdays = target.GetDays(Year, Month);

            pdays.AddRange(getBAMonthsAffairDays(Year, Month, target));
            pdays.Where(pday => pday > 0 && pday <= DateTime.DaysInMonth(Year, Month)).ToList().ForEach(pday =>
            {
                var targetdate = new DateTime(Year, Month, pday);
                if (!CheckTargetDate(Year, Month, pday))
                {
                    // 指定した日にちを対象とするルールが存在しなければカレンダーから削除
                    var schedule = calendar1.GetSchedule(targetdate);
                    CalendarControl.Schedule item = new CalendarControl.Schedule();
                    item.Start = targetdate;
                    calendar1.RemoveSchedule(item.Start);
                }
            });
        }
        private void setRule(RepeatRule rule)
        {
            // ルールに則ってカレンダーに不都合日を設定する
            var days = rule.GetDays(Year, Month);

            days.AddRange(getBAMonthsAffairDays(Year, Month, rule));
            days.Where(day => day > 0 && day <= DateTime.DaysInMonth(Year, Month)).ToList().ForEach(day =>
            {
                DateTime target = new DateTime(Year, Month, day);
                var schedule    = calendar1.GetSchedule(target);
                CalendarControl.Schedule item = new CalendarControl.Schedule();

                item.Start = target;
                if (schedule.Count() == 0)
                {
                    item.Item      = "×";
                    item.Alignment = StringAlignment.Center;
                    calendar1.RemoveSchedule(item.Start);
                    calendar1.AddSchedule(item);
                }
            });
            AddedRule.Add(rule);
        }
        private void SetOtherMonthsAffair(RepeatRule rule)
        {
            var list = StandbyLists.Where(p => rule.Start <= new DateTime(p.Year, p.Month, 1) && rule.End > new DateTime(p.Year, p.Month, DateTime.DaysInMonth(p.Year, p.Month))).Select(q => new { date = new DateTime(q.Year, q.Month, 1), person = q.Persons.FirstOrDefault(r => r.ID == Person.ID) });

            list.ToList().ForEach(u =>
            {
                // 現在の月はすでに不都合日設定してあるため、飛ばす。
                if (u.date.Year == Year && u.date.Month == Month)
                {
                    return;
                }
                if (u.person == null)
                {
                    return;
                }
                u.person.Requirement.RepeatRule.Add(rule);
                var days = rule.GetDays(u.date.Year, u.date.Month);
                days.AddRange(getBAMonthsAffairDays(u.date.Year, u.date.Month, rule));
                days.Where(day => day > 0 && day <= DateTime.DaysInMonth(u.date.Year, u.date.Month)).ToList().ForEach(day =>
                {
                    u.person[new DateTime(u.date.Year, u.date.Month, day)] = PossibleDays.Status.Affair;
                });
            });
        }