变更前: 变更后:
变更前: 变更后:
代码:
#region コンポーネント デザイナーで生成されたコード /// <summary> /// デザイナー サポートに必要なメソッドです。このメソッドの内容を /// コード エディターで変更しないでください。 /// </summary> private void InitializeComponent() { this.monthCalendar = new System.Windows.Forms.MonthCalendar(); this.nUpDownYear = new System.Windows.Forms.NumericUpDown(); this.label11 = new System.Windows.Forms.Label(); this.label10 = new System.Windows.Forms.Label(); this.label9 = new System.Windows.Forms.Label(); this.comBoxDay = new System.Windows.Forms.ComboBox(); this.comBoxHour = new System.Windows.Forms.ComboBox(); this.comBoxMonth = new System.Windows.Forms.ComboBox(); this.label8 = new System.Windows.Forms.Label(); ((System.ComponentModel.ISupportInitialize)(this.nUpDownYear)).BeginInit(); this.SuspendLayout(); // // monthCalendar // this.monthCalendar.Location = new System.Drawing.Point(17, 27); this.monthCalendar.MaxDate = new System.DateTime(2030, 12, 31, 23, 59, 0, 0); this.monthCalendar.MinDate = new System.DateTime(2013, 1, 1, 0, 0, 0, 0); this.monthCalendar.Name = "monthCalendar"; this.monthCalendar.ShowTodayCircle = false; this.monthCalendar.TabIndex = 55; this.monthCalendar.DateSelected += new System.Windows.Forms.DateRangeEventHandler(this.monthCalendar_DateSelected); // // nUpDownYear // this.nUpDownYear.Location = new System.Drawing.Point(2, 2); this.nUpDownYear.Maximum = new decimal(new int[] { 2030, 0, 0, 0}); this.nUpDownYear.Minimum = new decimal(new int[] { 2013, 0, 0, 0}); this.nUpDownYear.Name = "nUpDownYear"; this.nUpDownYear.ReadOnly = true; this.nUpDownYear.Size = new System.Drawing.Size(51, 19); this.nUpDownYear.TabIndex = 51; this.nUpDownYear.Value = new decimal(new int[] { 2013, 0, 0, 0}); this.nUpDownYear.ValueChanged += new System.EventHandler(this.nUpDownYear_ValueChanged); // // label11 // this.label11.AutoSize = true; this.label11.Location = new System.Drawing.Point(244, 6); this.label11.Name = "label11"; this.label11.Size = new System.Drawing.Size(17, 12); this.label11.TabIndex = 59; this.label11.Text = "時"; // // label10 // this.label10.AutoSize = true; this.label10.Location = new System.Drawing.Point(182, 5); this.label10.Name = "label10"; this.label10.Size = new System.Drawing.Size(17, 12); this.label10.TabIndex = 58; this.label10.Text = "日"; // // label9 // this.label9.AutoSize = true; this.label9.Location = new System.Drawing.Point(119, 5); this.label9.Name = "label9"; this.label9.Size = new System.Drawing.Size(17, 12); this.label9.TabIndex = 57; this.label9.Text = "月"; // // comBoxDay // this.comBoxDay.DropDownHeight = 375; this.comBoxDay.DropDownWidth = 20; this.comBoxDay.FormattingEnabled = true; this.comBoxDay.IntegralHeight = false; this.comBoxDay.Location = new System.Drawing.Point(142, 2); this.comBoxDay.Name = "comBoxDay"; this.comBoxDay.Size = new System.Drawing.Size(38, 20); this.comBoxDay.TabIndex = 53; this.comBoxDay.SelectedIndexChanged += new System.EventHandler(this.comBoxDay_SelectedIndexChanged); // // comBoxHour // this.comBoxHour.FormattingEnabled = true; this.comBoxHour.Items.AddRange(new object[] { "01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24"}); this.comBoxHour.Location = new System.Drawing.Point(202, 2); this.comBoxHour.Name = "comBoxHour"; this.comBoxHour.Size = new System.Drawing.Size(38, 20); this.comBoxHour.TabIndex = 54; this.comBoxHour.SelectedIndexChanged += new System.EventHandler(this.comBoxHour_SelectedIndexChanged); // // comBoxMonth // this.comBoxMonth.FormattingEnabled = true; this.comBoxMonth.Items.AddRange(new object[] { "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12"}); this.comBoxMonth.Location = new System.Drawing.Point(79, 2); this.comBoxMonth.Name = "comBoxMonth"; this.comBoxMonth.Size = new System.Drawing.Size(38, 20); this.comBoxMonth.TabIndex = 52; this.comBoxMonth.SelectedIndexChanged += new System.EventHandler(this.comBoxMonth_SelectedIndexChanged); // // label8 // this.label8.AutoSize = true; this.label8.Location = new System.Drawing.Point(56, 5); this.label8.Name = "label8"; this.label8.Size = new System.Drawing.Size(17, 12); this.label8.TabIndex = 56; this.label8.Text = "年"; // // UcMonthCalendar // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.Controls.Add(this.monthCalendar); this.Controls.Add(this.nUpDownYear); this.Controls.Add(this.label11); this.Controls.Add(this.label10); this.Controls.Add(this.label9); this.Controls.Add(this.comBoxDay); this.Controls.Add(this.comBoxHour); this.Controls.Add(this.comBoxMonth); this.Controls.Add(this.label8); this.Name = "UcMonthCalendar"; this.Size = new System.Drawing.Size(261, 195); this.Load += new System.EventHandler(this.UcMonthCalendar_Load); ((System.ComponentModel.ISupportInitialize)(this.nUpDownYear)).EndInit(); this.ResumeLayout(false); this.PerformLayout(); } #endregion public System.Windows.Forms.MonthCalendar monthCalendar; private System.Windows.Forms.NumericUpDown nUpDownYear; private System.Windows.Forms.Label label11; private System.Windows.Forms.Label label10; private System.Windows.Forms.Label label9; public System.Windows.Forms.ComboBox comBoxDay; public System.Windows.Forms.ComboBox comBoxHour; public System.Windows.Forms.ComboBox comBoxMonth; private System.Windows.Forms.Label label8;
后台代码:
public partial class UcMonthCalendar : UserControl { public UcMonthCalendar() { InitializeComponent(); } /// <summary> /// YearMonthDayHour /// </summary> public string YearMonthDayHour { get; set; } private DateTime tnow = DateTime.Now; //既定の28日 string[] sDay = { "1", "2", "3", "4", "5", "6", "7", "8", "9", "10","11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25", "26", "27", "28"}; //30ヶ月までの日数 string[] sMonthThirty = { "4", "6", "9", "11" }; //31ヶ月までの日数 string[] sMonthThirty_First = { "1", "3", "5", "7", "8", "10", "12" }; /// <summary> /// 日の選択数を維持するように変更する日の選択した数、年を保存 /// </summary> string sSlectDay = string.Empty; /// <summary> /// (閏年)を表示している状態 /// </summary> bool bLeapyear = false; /// <summary> /// (閏年)変更の29日を選択 /// </summary> string sLeapYear = string.Empty; private void UcMonthCalendar_Load(object sender, EventArgs e) { comBoxDay.SelectedIndexChanged -= new EventHandler(comBoxDay_SelectedIndexChanged); comBoxMonth.SelectedIndexChanged -= new EventHandler(comBoxMonth_SelectedIndexChanged); comBoxHour.SelectedIndexChanged -= new EventHandler(comBoxHour_SelectedIndexChanged); comBoxHour.Text = tnow.Hour.ToString().PadLeft(2,'0'); comBoxMonth.Text = tnow.Month.ToString(); comBoxYear.Text = tnow.Year.ToString(); BindShowDay(tnow.Year.ToString(), tnow.Month.ToString()); comBoxDay.SelectedIndexChanged += new EventHandler(comBoxDay_SelectedIndexChanged); comBoxMonth.SelectedIndexChanged += new EventHandler(comBoxMonth_SelectedIndexChanged); comBoxHour.SelectedIndexChanged += new EventHandler(comBoxHour_SelectedIndexChanged); monthCalendar.Select(); YearMonthDayHour = comBoxYear.Text + comBoxMonth.Text.PadLeft(2, '0') + comBoxDay.Text.PadLeft(2, '0') + comBoxHour.Text.PadLeft(2, '0'); ; //本月の土曜日と日曜日は太字表示する。 monthCalendar.BoldedDates = ComUtil.GetDayOfWeekend(monthCalendar.SelectionStart.ToString("yyyyMM")); //SelectYearMonthDayHour(); } /// <summary> /// 変更の日を選択 /// </summary> public void BindShowDay(string sYear, string sMonth) { DataTable tblDatas = new DataTable("MonthDay"); DataColumn dc = null; dc = tblDatas.Columns.Add("Day", Type.GetType("System.String")); DataRow newRow; for (int i = 0; i < sDay.Length; i++) { tblDatas.Rows.Add(sDay[i]); } //(閏年)を表示している状態 if ((Convert.ToInt32(sYear) % 4 == 0 && Convert.ToInt32(sYear) % 100 != 0) || Convert.ToInt32(sYear) % 400 == 0) { if (comBoxMonth.Text == "2") { bLeapyear = true; newRow = tblDatas.NewRow(); newRow["Day"] = "29"; tblDatas.Rows.InsertAt(newRow, 28); } } else { bLeapyear = false; } //判断包含30天的月 if (sMonthThirty.Contains(sMonth)) { newRow = tblDatas.NewRow(); newRow["Day"] = "29"; tblDatas.Rows.InsertAt(newRow, 28); newRow = tblDatas.NewRow(); newRow["Day"] = "30"; tblDatas.Rows.InsertAt(newRow, 29); } //判断包含31天的月 if (sMonthThirty_First.Contains(sMonth)) { newRow = tblDatas.NewRow(); newRow["Day"] = "29"; tblDatas.Rows.InsertAt(newRow, 28); newRow = tblDatas.NewRow(); newRow["Day"] = "30"; tblDatas.Rows.InsertAt(newRow, 29); newRow = tblDatas.NewRow(); newRow["Day"] = "31"; tblDatas.Rows.InsertAt(newRow, 30); } comBoxDay.DisplayMember = "Day"; comBoxDay.DataSource = tblDatas; if (!string.IsNullOrEmpty(sSlectDay)) { comBoxDay.Text = sSlectDay; return; } else { comBoxDay.Text = tnow.Day.ToString(); return; } } /// <summary> /// 取得変更后的DateTime /// </summary> public void ChangeDateTime() { string sTime = string.Empty; sTime = comBoxYear.Text + comBoxMonth.Text.PadLeft(2, '0'); //(閏年)を表示している状態 if (bLeapyear) { if (comBoxMonth.Text == "2") { //2月になったら、選択した日付の日は閏の月の日数より大きくの場合 if (int.Parse(sSlectDay) > 29) { sSlectDay = "1"; comBoxDay.Text = sSlectDay; } //2月になったら、選択した日付の日は閏の月の日数より小さくの場合 else if (int.Parse(sSlectDay) < 29) { comBoxDay.Text = sSlectDay; } //上記以外の場合 else { sSlectDay = "29"; comBoxDay.Text = sSlectDay; } } } else { //閏年ではなくで、2月の場合 if (comBoxMonth.Text == "2") { if (sLeapYear == "29") { sSlectDay = "28"; comBoxDay.Text = sSlectDay; sLeapYear = ""; } else if (int.Parse(sSlectDay) > 28) { sSlectDay = "1"; comBoxDay.Text = sSlectDay; } else comBoxDay.Text = sSlectDay; } } //毎月30日の場合 if (sMonthThirty.Contains(comBoxMonth.Text)) { if (int.Parse(sSlectDay) > 30) { sSlectDay = "1"; comBoxDay.Text = sSlectDay; } } //当日は空です if (!string.IsNullOrEmpty(sSlectDay)) { sTime = sTime + sSlectDay.PadLeft(2, '0'); } else { if (string.IsNullOrEmpty(comBoxDay.Text)) return; //日数を選択し、及び維持するために維持する sTime = sTime + comBoxDay.Text.PadLeft(2, '0'); } //} DateTime dt = DateTime.ParseExact(sTime, "yyyyMMdd", System.Globalization.CultureInfo.InvariantCulture); monthCalendar.SetDate(dt); monthCalendar.Select(); YearMonthDayHour = sTime + comBoxHour.Text.PadLeft(2, '0'); //本月の土曜日と日曜日は太字表示する。 monthCalendar.BoldedDates = ComUtil.GetDayOfWeekend(monthCalendar.SelectionStart.ToString("yyyyMM")); //SelectYearMonthDayHour(); } /// <summary> /// 選択月の状態に応じて実施するか否かをその日の選択 /// </summary> bool bSelectstate = false; /// <summary> /// 年の値の変更を選択してください /// </summary> private void nUpDownYear_ValueChanged(object sender, EventArgs e) { sSlectDay = comBoxDay.Text; sLeapYear = sSlectDay; bSelectstate = true; BindShowDay(comBoxYear.Text.ToString(), comBoxMonth.Text.ToString()); ChangeDateTime(); bSelectstate = false; } /// <summary> /// 月:コンボボックスの値の変更を選択してください /// </summary> private void comBoxMonth_SelectedIndexChanged(object sender, EventArgs e) { sSlectDay = comBoxDay.Text; bSelectstate = true; BindShowDay(comBoxYear.Text.ToString(), comBoxMonth.Text.ToString()); ChangeDateTime(); bSelectstate = false; comBoxMonth.Focus(); } /// <summary> /// 日:コンボボックスの値の変更を選択してください /// </summary> private void comBoxDay_SelectedIndexChanged(object sender, EventArgs e) { if (bSelectstate == false) { sSlectDay = comBoxDay.Text; ChangeDateTime(); } comBoxDay.Focus(); } private void comBoxHour_SelectedIndexChanged(object sender, EventArgs e) { YearMonthDayHour = comBoxYear.Text + comBoxMonth.Text.PadLeft(2, '0') + comBoxDay.Text.PadLeft(2, '0') + comBoxHour.Text.PadLeft(2, '0'); ; } /// <summary> /// MonthCalendarコントロールの変更で選択した日付が発生する。 /// </summary> private void monthCalendar_DateSelected(object sender, DateRangeEventArgs e) { ////本月の土曜日と日曜日は太字表示する。 //monthCalendar.BoldedDates = ComUtil.GetDayOfWeekend(monthCalendar.SelectionStart.ToString("yyyyMM")); //comBoxYear.Text = e.Start.Year.ToString(); //comBoxMonth.Text = e.Start.Month.ToString(); //comBoxDay.Text = e.Start.Day.ToString(); //monthCalendar.Focus(); } /// <summary> /// //特殊キー(スペースを含む)、および処理されません /// </summary> private void comBoxMonthDayHour_KeyPress(object sender, KeyPressEventArgs e) { if ((int)e.KeyChar < 32) { e.Handled = true; return; } e.Handled = true; return; } /// <summary> /// delete,Backキーを無効にする /// </summary> private void comBoxMonthDayHour_KeyDown(object sender, KeyEventArgs e) { if (e.KeyCode == Keys.Delete || e.KeyCode == Keys.Back) { e.Handled = true; return; } } /// <summary> /// 本月の土曜日と日曜日は太字表示する。 /// </summary> private void monthCalendar_MouseDown(object sender, MouseEventArgs e) { MonthCalendar tmp = (MonthCalendar)sender; MonthCalendar.HitTestInfo hitInfo = monthCalendar.HitTest(e.Location); string sNextMonthDay = tmp.SelectionStart.Year + tmp.SelectionStart.Month.ToString().PadLeft(2, '0') +YearMonthDayHour.Substring(6,2).PadLeft(2, '0'); DateTime dt = DateTime.ParseExact(sNextMonthDay, "yyyyMMdd", System.Globalization.CultureInfo.InvariantCulture); if (hitInfo.HitArea == MonthCalendar.HitArea.PrevMonthButton || hitInfo.HitArea==MonthCalendar.HitArea.NextMonthButton ||hitInfo.HitArea == MonthCalendar.HitArea.Date) { //本月の土曜日と日曜日は太字表示する。 monthCalendar.BoldedDates = ComUtil.GetDayOfWeekend(sNextMonthDay.Substring(0, 6)); comBoxYear.Text = tmp.SelectionStart.Year.ToString(); comBoxMonth.Text = tmp.SelectionStart.Month.ToString(); comBoxDay.Text = tmp.SelectionStart.Day.ToString(); monthCalendar.SetDate(dt); monthCalendar.Focus(); } } } } ps:其实还是不完善。
另外一版代码。主要注释的代码是判断选择24时后进行判断年月日 变化的。 例如1.31 24时则变化为2.1 00
/// <summary> /// 取得変更后的DateTime /// </summary> public void ChangeDateTime() { string sTime = string.Empty; sTime = nUpDownYear.Value+ comBoxMonth.Text.PadLeft(2, '0'); //2013/0312 begin //時指定変更 //if (comBoxHour.Text == "24") //{ // //開始日時の年+1 // if (comBoxMonth.Text.PadLeft(2, '0') + comBoxDay.Text.PadLeft(2, '0') == "1231") // { // if (!string.IsNullOrEmpty(nUpDownYear.Value.ToString())) // { // sTime = nUpDownYear.Value + 1 + "010100"; // //comBoxMonth.Text = "1"; // //comBoxDay.Text = "1"; // //sSlectDay = "1"; // //nUpDownYear.Value = nUpDownYear.Value + 1; // //return; // } // } // //変更した月の1日が表示される // else if (comBoxDay.Text.PadLeft(2, '0') == "31") // { // sTime = nUpDownYear.Value + Convert.ToString(int.Parse(comBoxMonth.Text) + 1).PadLeft(2, '0') + "0100"; // //sSlectDay = "1"; // //comBoxMonth.Text = Convert.ToString(int.Parse(comBoxMonth.Text) + 1); // } // //開始日時の日+1 // else // { // sTime = sTime + Convert.ToString(int.Parse(comBoxDay.Text) + 1).PadLeft(2, '0') + "00"; // comBoxDay.Text = Convert.ToString(int.Parse(comBoxDay.Text) + 1); // } //} //else //{ //20130312 end //(閏年)を表示している状態 if (bLeapyear) { if (comBoxMonth.Text == "2") { //2月になったら、選択した日付の日は閏の月の日数より大きくの場合 if (int.Parse(sSlectDay) > 29) { sSlectDay = "1"; comBoxDay.Text = sSlectDay; } //2月になったら、選択した日付の日は閏の月の日数より小さくの場合 else if (int.Parse(sSlectDay) < 29) { comBoxDay.Text = sSlectDay; } //上記以外の場合 else { sSlectDay = "29"; comBoxDay.Text = sSlectDay; } } } else { //閏年ではなくで、2月の場合 if (comBoxMonth.Text == "2") { if (sLeapYear == "29") { sSlectDay = "28"; comBoxDay.Text = sSlectDay; sLeapYear = ""; } else if (int.Parse(sSlectDay) > 28) { sSlectDay = "1"; comBoxDay.Text = sSlectDay; } else comBoxDay.Text = sSlectDay; } } //毎月30日の場合 if (sMonthThirty.Contains(comBoxMonth.Text)) { if (int.Parse(sSlectDay) > 30) { sSlectDay = "1"; comBoxDay.Text = sSlectDay; } } //20130312 begin ////当日は空です //if (!string.IsNullOrEmpty(sSlectDay)) //{ // sTime = sTime + sSlectDay.PadLeft(2, '0') + comBoxHour.Text.PadLeft(2, '0'); //} //else //{ // if (string.IsNullOrEmpty(comBoxDay.Text)) return; // //日数を選択し、及び維持するために維持する // sTime = sTime + comBoxDay.Text.PadLeft(2, '0') + comBoxHour.Text.PadLeft(2, '0'); //} //20130312 end //当日は空です if (!string.IsNullOrEmpty(sSlectDay)) { sTime = sTime + sSlectDay.PadLeft(2, '0'); } else { if (string.IsNullOrEmpty(comBoxDay.Text)) return; //日数を選択し、及び維持するために維持する sTime = sTime + comBoxDay.Text.PadLeft(2, '0'); } //} DateTime dt = DateTime.ParseExact(sTime, "yyyyMMdd", System.Globalization.CultureInfo.InvariantCulture); monthCalendar.SetDate(dt); monthCalendar.Select(); }