予定管理に使えるアプリを作成することにします。
項目を新規に登録したり、既存の項目を編集することができます。また予定には期限があるものもあります。重要なものやそうでないものもあります。このようなことを登録して締め切りまえに時間がないものや重要度が高いものだけを表示するといった機能ももたせます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
public class Data { public Data() { } public Data(string itemText, DateTime deadline, int importance, int category, string dataString) { ItemText = itemText; Deadline = deadline; Importance = importance; Category = category; DataString = dataString; } public string ItemText = ""; public DateTime Deadline = new DateTime(); public int Importance = 0; public int Category = 0; public string DataString = ""; } |
登録するデータはこんな感じ。項目の名前と締め切り日、重要度、詳細について登録できるようにしています。
フォームにはリストビューを表示させます。
カラムを5つ作ります。プロパティーの設定は
1 2 3 |
listView1.View = View.Details; listView1.FullRowSelect = true; listView1.MultiSelect = false; // 複数選択はしない |
あとはデフォルトでよいと思います。
[新規]がクリックされたら登録用のフォームを表示します。
DateTimePickerをふたつ配置して日と時刻を設定できるようにしています。
右側は日付ではなく時刻を表示できるように以下のように設定。
1 2 3 |
deadlineDateTimePicker2.Format = System.Windows.Forms.DateTimePickerFormat.Time; deadlineDateTimePicker2.ShowUpDown = true; this.deadlineDateTimePicker2.Value = new System.DateTime(2020, 2, 18, 23, 59, 0, 0); |
またShowDialog()で表示させ、[OK]のボタンを押したらDialogResult.OKを返すようにします。
1 |
buttonOK.DialogResult = System.Windows.Forms.DialogResult.OK; |
[新規]がクリックされたらDataクラスのインスタンスを生成してリストのなかに格納し、これをもとにリストビューに表示されるアイテムを変更させます。
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 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
public partial class Form1 : Form { List<Data> datas = new List<Data>(); private void buttonNew_Click(object sender, EventArgs e) { // 登録用のフォームを表示 RegistForm f = new RegistForm(); if(f.ShowDialog() != DialogResult.OK) return; string itemText = f.ItemTextBox.Text; DateTime dt1 = f.deadlineDateTimePicker1.Value; DateTime dt2 = f.deadlineDateTimePicker2.Value; DateTime dt = new DateTime(dt1.Year, dt1.Month, dt1.Day, dt2.Hour, dt2.Minute, dt2.Second); int imp = (int)f.ImportanceNumericUpDown.Value; int cat = f.categoryComboBox.SelectedIndex; string dataString = f.dataStringRichTextBox.Text; Data data = new Data(itemText, dt, imp, cat, dataString); datas.Add(data); UpdateListViewItems(); } void UpdateListViewItems() { var indexes = listView1.SelectedIndices; listView1.Items.Clear(); foreach(Data data in datas) { AddListViewItemFromData(data); } if(indexes.Count != 0) listView1.Items[indexes[0]].Selected = true; } void AddListViewItemFromData(Data data) { string itemText = data.ItemText; string deadlineText = data.Deadline.ToString(); string inportanceText = data.Importance.ToString(); string category = "";// 暫定的に string dataString = data.DataString; ListViewItem item = new ListViewItem(new string[]{ itemText, deadlineText, inportanceText, category, dataString}); listView1.Items.Add(item); } } |
これで新しい項目を追加することはできます。
次に既存の項目を編集する機能が必要です。選択されているアイテムがあるか調べて、選択されている項目があるならその内容を登録用のフォームに表示させます。[OK]がクリックされたらフォームの内容を取得してデータを変更し、これをリストビューに反映させます。
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 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
public partial class Form1 : Form { private void buttonEdit_Click(object sender, EventArgs e) { Data data = GetDataFromListViewItem(); if(data == null) return; RegistForm f = new RegistForm(); SetDataToRegistForm(f, data); if(f.ShowDialog() != DialogResult.OK) return; SetDataFromRegistForm(f, data); UpdateListViewItems(); } Data GetDataFromListViewItem() { if(listView1.SelectedIndices.Count == 0) return null; int selIndex = listView1.SelectedIndices[0]; return datas[selIndex]; } void SetDataToRegistForm(RegistForm f, Data data) { f.ItemTextBox.Text = data.ItemText; f.deadlineDateTimePicker1.Value = data.Deadline; f.deadlineDateTimePicker2.Value = data.Deadline; f.ImportanceNumericUpDown.Value = data.Importance; f.categoryComboBox.SelectedIndex = data.Category; f.dataStringRichTextBox.Text = data.DataString; } void SetDataFromRegistForm(RegistForm f, Data data) { data.ItemText = f.ItemTextBox.Text; DateTime dt1 = f.deadlineDateTimePicker1.Value; DateTime dt2 = f.deadlineDateTimePicker2.Value; data.Deadline = new DateTime(dt1.Year, dt1.Month, dt1.Day, dt2.Hour, dt2.Minute, dt2.Second); data.Importance = (int)f.ImportanceNumericUpDown.Value; data.Category = f.categoryComboBox.SelectedIndex; data.DataString = f.dataStringRichTextBox.Text; } } |
また必要のない項目を削除する機能も必要です。
1 2 3 4 5 6 7 8 9 10 11 12 |
public partial class Form1 : Form { private void buttonDelete_Click(object sender, EventArgs e) { if(listView1.SelectedIndices.Count == 0) return; int selIndex = listView1.SelectedIndices[0]; datas.RemoveAt(selIndex); listView1.Items.RemoveAt(selIndex); } } |
また入力された情報をファイルとして保存したり読み出す機能も必要です。
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 33 34 35 36 37 38 |
using System.Xml.Serialization; using System.IO; public partial class Form1 : Form { private void buttonSaveFile_Click(object sender, EventArgs e) { SaveFileDialog dialog = new SaveFileDialog(); dialog.Filter = "データファイル|*.dat"; dialog.Title = "データを保存"; if(dialog.ShowDialog() != DialogResult.OK) return; XmlSerializer xml = new XmlSerializer(typeof(List<Data>)); using(StreamWriter sw = new StreamWriter(dialog.FileName)) { xml.Serialize(sw, datas); } } private void buttonLoadFile_Click(object sender, EventArgs e) { OpenFileDialog dialog = new OpenFileDialog(); dialog.Filter = "データファイル|*.dat"; dialog.Title = "ファイルの読み出し"; if(dialog.ShowDialog() != DialogResult.OK) return; XmlSerializer xml = new XmlSerializer(typeof(List<Data>)); using(StreamReader sr = new StreamReader(dialog.FileName)) { datas = (List<Data>)xml.Deserialize(sr); UpdateListViewItems(); } } } |
githubを公開する予定はないですか?
登録用のformの記述などを拝見したいのでソースコードをいただけますでしょうか。
予定管理アプリをつくってみる
https://lets-csharp.com/todo-management/
項目順を並べ替える 予定管理アプリをつくってみる
https://lets-csharp.com/choice-indication-todo-management/
カテゴリを作る 予定管理アプリをつくってみる
https://lets-csharp.com/category-todo-management/
アプリが起動されたらファイルを読み込めるようにする
https://lets-csharp.com/startup-loadfile/
上記のソースコードです。
https://lets-csharp.com/samples/2201/todo-app.zip
ありがとうございます!!
参考にさせていただきます。