現状ではタスクの名前と担当者の名前を登録することはできても各タスクの開始日、終了日を設定することができません。そこでタスクの開始日、終了日、表示色を変更できるようにします。
Contents
SetTaskDateFormクラス
タスクの開始日、終了日、表示色を変更したいときはダイアログで設定します。そのダイアログのコードを示します。
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 29 30 31 32 |
public partial class SetTaskDateForm : Form { public SetTaskDateForm(DateTime taskStartDay, DateTime taskEndDay, Color taskColor) { InitializeComponent(); DtpTaskStart.Value = taskStartDay; DtpTaskEnd.Value = taskEndDay; TaskColor = taskColor; ButtonOK.DialogResult = DialogResult.OK; } public Color TaskColor = Color.Empty; public DateTime TaskStartDay = DateTime.Today; public DateTime TaskEndDay = DateTime.Today; private void ButtonSelectColor_Click(object sender, EventArgs e) { ColorDialog dialog = new ColorDialog(); dialog.Color = TaskColor; if (dialog.ShowDialog() == DialogResult.OK) { TaskColor = dialog.Color; } dialog.Dispose(); } private void ButtonOK_Click(object sender, EventArgs e) { TaskStartDay = DtpTaskStart.Value; TaskEndDay = DtpTaskEnd.Value; } } |
コンテキストメニューを表示させる
次にTaskUserControlが右クリックされたらタスクの開始日、終了日、表示色を変更するためのメニューが表示されるようにします。TaskUserControlクラスのコンストラクタに以下を追加します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
public partial class TaskUserControl : UserControl { public TaskUserControl() { InitializeComponent(); InitContextMenu(); } ContextMenuStrip ContextMenuStrip1 = new ContextMenuStrip(); ToolStripMenuItem SetTaskDateMenuItem = new ToolStripMenuItem(); void InitContextMenu() { this.ContextMenuStrip = this.ContextMenuStrip1; // メニュー「日時設定」を追加 this.SetTaskDateMenuItem.Text = "日時設定"; this.SetTaskDateMenuItem.Click += SetTaskDateMenuItem_Click; this.ContextMenuStrip.Items.AddRange(new ToolStripItem[] { this.SetTaskDateMenuItem, }); } } |
設定を反映させる
あとはメニュー「日時設定」が選択されたらダイアログを表示して設定を反映させるだけです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
public partial class TaskUserControl : UserControl { private void SetTaskDateMenuItem_Click(object sender, EventArgs e) { // これまでの設定をダイアログに設定 SetTaskDateForm setTaskDateForm = new SetTaskDateForm(TaskStartDay, TaskEndDay, TaskColor); if (setTaskDateForm.ShowDialog() == DialogResult.OK) { // 新しい設定をダイアログから取得して反映させる // ただし開始日より終了日が前の場合は「設定が不正」のメッセージボックスを表示する if (setTaskDateForm.TaskStartDay.Date <= setTaskDateForm.TaskEndDay.Date) { TaskColor = setTaskDateForm.TaskColor; TaskStartDay = setTaskDateForm.TaskStartDay; TaskEndDay = setTaskDateForm.TaskEndDay; UpdateBand(); } else MessageBox.Show("設定が不正です", "エラー", MessageBoxButtons.OK, MessageBoxIcon.Error); } setTaskDateForm.Dispose(); } } |
チャートに表示される最初の日付と最後の日付を変更する
Form1でメニューをクリックしたらチャートに表示される最初の日付と最後の日付を変更できるようにします。そのためのダイアログを表示させるためにSetBandDateFormクラスをつくります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
public partial class SetBandDateForm : Form { public SetBandDateForm(int prevDays, int afterDays) { InitializeComponent(); NumUpDownPrevDays.Minimum = 0; NumUpDownAfterDays.Minimum = 1; NumUpDownPrevDays.Value = prevDays; NumUpDownAfterDays.Value = afterDays; ButtonOK.DialogResult = DialogResult.OK; } public int PrevDays = 0; public int AfterDays = 0; private void ButtonOK_Click(object sender, EventArgs e) { PrevDays = (int)NumUpDownPrevDays.Value; AfterDays = (int)NumUpDownAfterDays.Value; } } |
ダイアログの表示と設定の反映
Form1の[チャートの設定]ボタンをクリックするとダイアログが表示されます。ダイアログが閉じられると新しい設定が取得され、反映されます。
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 |
public partial class Form1 : Form { private async void ButtonConfigChart_Click(object sender, EventArgs e) { int prevDays = TaskUserControl.GetPrevDays(); int afterDays = TaskUserControl.GetAfterDays(); SetBandDateForm setBandDateForm = new SetBandDateForm(prevDays, afterDays); if (setBandDateForm.ShowDialog() == DialogResult.OK) { DateTime startDate = DateTime.Today - new TimeSpan(setBandDateForm.PrevDays, 0, 0, 0); TaskUserControl.SetBandStartDay(startDate.Year, startDate.Month, startDate.Day); DateTime endDate = DateTime.Today + new TimeSpan(setBandDateForm.AfterDays, 0, 0, 0); TaskUserControl.SetBandEndDay(endDate.Year, endDate.Month, endDate.Day); foreach (Control control in PanelMain.Controls) { if (control.GetType() == typeof(TaskUserControl)) ((TaskUserControl)control).UpdateBand(); } await Task.Delay(100); this.Invalidate(); } setBandDateForm.Dispose(); } } |