using System; using System.Collections.Generic; using System.ComponentModel; using System.Drawing; using System.Data; using System.Linq; using System.Text; using System.Windows.Forms; using ryCommon; namespace ryControls { /// /// 日历控件 /// [DefaultEvent("OnClickItem")] [Description("农历日历控件")] public partial class ChinaCalendar : UserControl { /// /// 单击事件 /// /// /// public delegate void ClickItemHandler(object sender, DateTime dt); private List list_lunar = new List(); /// /// 单击某个日期事件 /// public event ClickItemHandler OnClickItem; /// /// 日历控件 /// public ChinaCalendar() { InitializeComponent(); ryCommon.ListX list = new ListX(PnlDay) { MaxColCount = 7, spaceX = 1, spaceY = 1 }; int day_width = 0; for (int i = 0; i < 42; i++) { LunarDay lunarday = new LunarDay { Day = i + 1, Lunar_Day = (i + 1).ToString(), //Size = new Size(120, 120) }; lunarday.Click += Lunarday_Click; lunarday.OnProcessCmdKey += Lunarday_OnProcessCmdKey; if (day_width == 0) { day_width = lunarday.Width; } list_lunar.Add(lunarday); list.Add(lunarday); } list.ReDraw(); for(int i=0;i<7;i++) { Label lbl_week = new Label { AutoSize = false, TextAlign = ContentAlignment.MiddleCenter, Text = "星期" + RyDate.GetWeekName(i + 1), Left = i * day_width, Width = day_width, Parent = PnlWeek }; } DateTime = DateTime.Now; } private void Lunarday_OnProcessCmdKey(object sender, ref Message msg, Keys keyData) { var _dt = DateTime; if (last_selected_item != null) { _dt = last_selected_item.Date; } switch (keyData) { case Keys.Right: _dt = _dt.AddDays(1); break; case Keys.Left: _dt = _dt.AddDays(-1); break; case Keys.Up://方向键不反应 _dt = _dt.AddDays(-7); break; case Keys.Down: _dt = _dt.AddDays(7); break; } DateTime = _dt; //ChangeDate(_dt,true); } private LunarDay last_selected_item = null; private void Lunarday_Click(object sender, EventArgs e) { //throw new NotImplementedException(); LunarDay lunarday=(LunarDay)sender; if(last_selected_item!= lunarday) { if (last_selected_item != null) { last_selected_item.Selected = false; } last_selected_item = lunarday; lunarday.Selected = true; } lunarday.Focus(); OnClickItem?.Invoke(this,lunarday.Date); //if(lunarday.Date.Month!=DateTime.Month) //{ // DateTime = lunarday.Date; //} //for (int i = 0; i < list_lunar.Count; i++) //{ // if(list_lunar[i]==lunarday) // { // list_lunar[i].Selected=true; // } // else { list_lunar[i].Selected = false ; } //} } private DateTime _DateTime = DateTime.Now; /// /// 设置日期 /// public DateTime DateTime { get { return _DateTime; } set { if (_DateTime != value) { _DateTime = value; ChangeDate(value,true); } } } private void ChangeDate(DateTime dt) { ChangeDate(dt, false); } /// /// 放假数据表 /// public string HolidayFolder { get; set; } = Application.StartupPath + "\\SysDb\\Holidays"; private void ChangeDate(DateTime dt,bool selected) { ProcUse = true; NumYear.Value = dt.Year; CbbMonth.SelectedIndex = dt.Month - 1; ProcUse = false; var gl_daycount = 0; if (dt.Year < 1582 || (dt.Year == 1582 && dt.Month <= 10)) { gl_daycount =11; } var month_date= RyDate.GetMonthStart(dt); var start_week = RyDate.GetWeek_index(month_date.AddDays(-gl_daycount)); var dt_now = DateTime.Now; Ini ini = new Ini(HolidayFolder+"\\"+dt.Year+".ini"); last_selected_item = null; DateTime? dt_1fu = null; DateTime? dt_2fu = null; DateTime? dt_3fu = null; if (dt.Month==7 || dt.Month==8) { dt_1fu = ChinaDate.Get3Fu(dt.Year, 0); dt_2fu = dt_1fu.Value.AddDays(10); dt_3fu = ChinaDate.Get3Fu(dt.Year, 2); } for (int i = 0; i <42; i++) { var dt_2 = month_date.AddDays(i+1- start_week); if(month_date.Year==1582 && month_date.Month==10) { if(i>=4) { dt_2 = dt_2.AddDays(10); } } var lunar = list_lunar[i]; lunar.Day = dt_2.Day; lunar.Selected = false; if(i>=35) { lunar.Visible = month_date.AddDays(36 - start_week).Month == dt.Month; if (!lunar.Visible) { continue; } } if ((i+1)%7==0) { lunar.SetRestState(1); } else { lunar.SetRestState(0); } if(dt_2.Date==dt.Date) { if (last_selected_item != lunar) { if (last_selected_item != null) { last_selected_item.Selected = false; } last_selected_item = lunar; lunar.Selected = true; } } if (dt_2.Year == dt.Year) { int state = ini.ReadIni("date", dt_2.ToString("MMdd"), -2); if (state != -2) { lunar.SetRestState(state); } } else { Ini ini2 = new Ini(HolidayFolder + "\\" + dt_2.Year + ".ini"); int state = ini2.ReadIni("date", dt_2.ToString("MMdd"), -2); if (state != -2) { lunar.SetRestState(state); } } var ChinaHoliday= ChinaDate.GetChinaHoliday(dt_2); var WorldHoliday = ChinaDate.GetHoliday(dt_2); var WeekHoliday = ChinaDate.GetWeekHoliday(dt_2); var JieqiHoliday = ChinaDate.GetSolarTerm(dt_2); bool Holiday = false; string Holiday_Str = ""; if (ChinaHoliday != "") { Holiday_Str = ChinaHoliday;} if (dt_2 ==dt_1fu) { Holiday_Str += " 初伏"; } if (dt_2 == dt_2fu) { Holiday_Str += " 中伏"; } if (dt_2 == dt_3fu) { Holiday_Str += " 末伏"; } if (WorldHoliday != "") { Holiday_Str += " " + WorldHoliday; } if (WeekHoliday != "") { Holiday_Str += " " + WeekHoliday; } if (JieqiHoliday!="") { Holiday_Str += " " + JieqiHoliday; } if (Holiday_Str!="") { lunar.Lunar_Day = Holiday_Str.Trim(); lunar.Lunar_Day_ForeColor = Color.Orange; Holiday = true; } else { var lunar_day_str = ChinaDate.GetDay(dt_2); if (lunar_day_str == "初一") { lunar.Lunar_Day = ChinaDate.GetMonth(dt_2); } else { lunar.Lunar_Day = lunar_day_str; } } lunar.Date = dt_2; if (dt_2.Month!=dt.Month)//不是当月 { lunar.Day_ForeColor = Color.FromArgb(190,190,190); if (!Holiday) { lunar.Lunar_Day_ForeColor = Color.FromArgb(190, 190, 190); } lunar.BackColor = Color.White; } else { if (dt_2.Date == dt_now.Date) { lunar.BackColor = Color.FromArgb(47, 152, 222); lunar.Day_ForeColor = Color.White; if (!Holiday) { lunar.Lunar_Day_ForeColor = Color.White; } } else { lunar.Day_ForeColor = Color.Black; if (!Holiday) { lunar.Lunar_Day_ForeColor = Color.Black; } lunar.BackColor = Color.White; } } } } bool ProcUse = false; private void NumYear_ValueChanged(object sender, EventArgs e) { if (ProcUse) { return; } DateTime = new DateTime(NumYear.Value.ToInt(), CbbMonth.SelectedIndex + 1, 1); OnClickItem?.Invoke(this, DateTime.Date); } private void CbbMonth_SelectedIndexChanged(object sender, EventArgs e) { if (ProcUse) { return; } DateTime = new DateTime(NumYear.Value.ToInt(), CbbMonth.SelectedIndex + 1, 1); OnClickItem?.Invoke(this, DateTime.Date); } private void BtnMonthPrev_Click(object sender, EventArgs e) { DateTime = DateTime.AddMonths(-1); OnClickItem?.Invoke(this, DateTime.Date); } private void BtnMonthNext_Click(object sender, EventArgs e) { DateTime = DateTime.AddMonths(1); OnClickItem?.Invoke(this, DateTime.Date); } private void BtnToday_Click(object sender, EventArgs e) { DateTime = DateTime.Now; OnClickItem?.Invoke(this, DateTime.Date); } } }