/// <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; }); }); }