运行效果如下:
实例代码如下:
using System; using System.Collections.Generic; using System.ComponentModel; using System.Drawing; using System.Data; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace Demo.UC { public partial class ChbDater : UserControl { /// <summary> /// 本次操作所选日期列表 /// </summary> private List<string> dataList = new List<string>(); public List<string> CurrentDataList { get { return this.dataList; } set { dataList = value; } } public ChbDater() { InitializeComponent(); } private void ChbDater_Load(object sender, EventArgs e) { InitYearAndMonth(); InitDaysControl(DateTime.Now.Year, DateTime.Now.Month); } private void InitDaysControl(int year, int month) { int uDays = 0; if (month != 1) uDays = DateTime.DaysInMonth(year, month - 1);//当前月上一月的总天数 DateTime oneDay = new DateTime(year, month, 1);//当前月的第一天 int count = GetDays(oneDay.ToString("dddd")); //初始化上一月日期信息 int k = count; for (int i = count - 1; i > 0; i--) { k--; CheckBox chb = tlpcontent.Controls.Find("checkBox" + k, true)[0] as CheckBox; if (chb != null) { if (k != 1) uDays--; chb.Text = uDays.ToString(); chb.Visible = true; chb.Enabled = false; } } //当前月日期初始化 int days = DateTime.DaysInMonth(year, month);//当前月的总天数 for (int i = 0; i < days; i++) { CheckBox chb = tlpcontent.Controls.Find("checkBox" + (i + count), true)[0] as CheckBox; if (chb != null) { //chb.Text = oneDay.AddDays(i).ToString("yyyy-MM-dd (dddd)"); chb.Text = oneDay.AddDays(i).ToString("dd"); chb.Enabled = true; chb.Visible = true; } } //下一月日期初始化 DateTime downMonth = new DateTime(year, month, 1); if (month != 12) downMonth = new DateTime(year, month + 1, 1);//当前月的第一天 int kk = 0; for (int i = (days + count); i <= 42; i++) { CheckBox chb = tlpcontent.Controls.Find("checkBox" + i, true)[0] as CheckBox; chb.Text = downMonth.AddDays(kk).ToString("dd"); chb.Visible = true; chb.Enabled = false; kk++; } } private int GetDays(string weekDay) { switch (weekDay) { case "星期一": return 1; case "星期二": return 2; case "星期三": return 3; case "星期四": return 4; case "星期五": return 5; case "星期六": return 6; case "星期天": case "星期日": return 7; } return 0; } private void InitYearAndMonth() { List<int> years = new List<int>(); for (int i = -5; i <= 5; i++)//前置5年,后置5年 共11年 { if (i < 0) years.Add(DateTime.Now.Year + i); if (i >= 0) years.Add(DateTime.Now.Year + i); } this.cmbYear.DataSource = years; this.cmbYear.SelectedIndex = 5; this.cmbMonth.Text = DateTime.Now.Month.ToString(); } private void cmbYear_SelectedIndexChanged(object sender, EventArgs e) { if (string.IsNullOrEmpty(this.cmbYear.Text)) this.cmbYear.Text = DateTime.Now.Year.ToString(); if (string.IsNullOrEmpty(this.cmbMonth.Text)) this.cmbMonth.Text = DateTime.Now.Month.ToString(); InitDaysControl(int.Parse(this.cmbYear.Text), int.Parse(this.cmbMonth.Text)); } private void checkBox1_CheckedChanged(object sender, EventArgs e) { CheckBox chb = sender as CheckBox; if (chb.Checked) { string month = this.cmbMonth.Text; if (int.Parse(month) < 10) month = "0" + month; CurrentDataList.Add(this.cmbYear.Text + "-" + month + "-" + chb.Text); chb.BackColor = Color.Wheat; } else { string month = this.cmbMonth.Text; if (int.Parse(month) < 10) month = "0" + month; CurrentDataList.Remove(this.cmbYear.Text + "-" + month + "-" + chb.Text); chb.BackColor = SystemColors.Control; } } private void btnTest_Click(object sender, EventArgs e) { StringBuilder buf = new StringBuilder(); foreach (string item in CurrentDataList) { buf.Append(item); buf.Append(" "); } MessageBox.Show(buf.ToString()); } } }