質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Q&A

1回答

1502閲覧

Month Calendarについて

AIUABC

総合スコア0

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

0グッド

1クリップ

投稿2020/07/30 11:44

編集2021/09/14 02:17

C#

1using System; 2using System.Collections.Generic; 3using System.ComponentModel; 4using System.Data; 5using System.Drawing; 6using System.Linq; 7using System.Text; 8using System.Threading.Tasks; 9using System.Windows.Forms; 10namespace MyHouseKeepingBook 11{ 12 public partial class Form1 : Form 13 { 14 public Form1() 15 { 16 InitializeComponent(); 17 } 18 private void buttonAdd_Click(object sender, EventArgs e) 19 { 20 AddData(); 21 } 22 private void 追加AToolStripMenuItem_Click(object sender, EventArgs e) 23 { 24 AddData(); 25 } 26 private void AddData() 27 { 28 ItemForm frmItem = new ItemForm(CategoryDataSet1); 29 DialogResult drRet = frmItem.ShowDialog(); 30 if (drRet == DialogResult.OK) 31 { 32 moneyDataSet.moneyDataTable.AddmoneyDataTableRow( 33 frmItem.monCalendar.SelectionRange.Start, 34 frmItem.cmbCategory.Text, 35 frmItem.txtItem.Text, 36 int.Parse(frmItem.mtxtMoney.Text), 37 frmItem.txtRemarks.Text); 38 } 39 } 40 private void Form1_Load(object sender, EventArgs e) 41 { 42 LoadData(); 43 categoryDataSet1.CategoryDataTable.AddCategoryDataTableRow("給料", "入金"); 44 categoryDataSet1.CategoryDataTable.AddCategoryDataTableRow("食費", "出金"); 45 categoryDataSet1.CategoryDataTable.AddCategoryDataTableRow("雑費", "出金"); 46 categoryDataSet1.CategoryDataTable.AddCategoryDataTableRow("住居", "出金"); 47 } 48 private void buttonEnd_Click(object sender, EventArgs e) 49 { 50 this.Close(); 51 } 52 private void 終了XToolStripMenuItem_Click(object sender, EventArgs e) 53 { 54 this.Close(); 55 } 56 private void SaveData() 57 { 58 string path = "MoneyData.csv"; //出力ファイル名 59 string strData = ""; //一行分のデータ 60 System.IO.StreamWriter sw = new System.IO.StreamWriter( 61 path, 62 false, 63 System.Text.Encoding.Default); 64 foreach (MoneyDataSet.moneyDataTableRow drMoney 65 in moneyDataSet.moneyDataTable) 66 { 67 strData = drMoney.日付.ToShortDataString() + "," 68 + drMoney.分類 + "," 69 + drMoney.品目 + "," 70 + drMoney.金額.ToString() + "," 71 + drMoney.備考; 72 sw.WriteLine(strData); 73 } 74 sw.Close(); 75 } 76 private void 保存SToolStripMenuItem_Click(object sender, EditorArgs e) 77 { 78 SaveData(); 79 } 80 private void form1_FormClosing(object sender, FormClosingEditorArgs e) 81 { 82 SaveData(); 83 } 84 private void LoadData() 85 { 86 string path = "MoneyData.csv"; //入力ファイル名 87 string delimStr = ","; // 区切り文字 88 char[] delimiter = delimStr.ToCharArray(); // 区切り文字をまとめる 89 string[] strLine; // 分解後の文字の入れ物 90 string strLine; // 一行分のデータ 91 bool fileExists = System.IO.File.Exists(path); 92 if (fileExists) 93 { 94 System.IO.StreamReader sr = new System.IO.StreamReader( 95 path, 96 System.Text.Encoding.Default); 97 while (sr.Peek() >= 0) 98 { 99 strLine = sr.ReadLine(); 100 strData = strLine.Splite(delimiter); 101 moneyDataSet.moneyDataTable.AddmoneyDataTableRow( 102 DateTime.Parse(strData[0]), 103 strData[1], 104 strData[2], 105 int, Parse(strData[3]), 106 strData[4]; 107 } 108 sr.Close; 109 } 110 } 111 private void UpdateData() 112 { 113 int nowRow = dgv.CurrentRow, Index; 114 DateTime oldDate 115 = DateTime.Parse(dgv.Rows[nowRow].Cell[0].Value.ToString()); 116 string oldCategory = dgv.Rows[nowRow].Cell[1].Value.ToString(); 117 string oldItem = dgv.Rows[nowRow].Cell[2].Value.ToString(); 118 int oldMoney 119 = int.Parse(dgv.Rows[nowRow].Cells[3].Value.ToString()); 120 string oldRemarks = dgv.Rows[nowRow].Cells[4].Value.ToString(); 121 ItemForm frmItem = newItemForm(categoryDataSet1, 122 oldDate, 123 oldCategory, 124 oldItem, 125 oldMoney, 126 oldRemarks); 127 DialogResult draRet = frmItem.ShowDialog(); 128 if (draRet == DialogResult.OK) 129 { 130 dgv.Rows[nowRow].Cells[0].Value 131 = frmItem.monCalendar.SelectionRangr.Start; 132 dgv.Rows[nowRow].Cells[1].Value = frmItem.cmbCategory.Text; 133 dgv.Rows[nowRow].Cells[2].Value = frmItem.txtItem.Text; 134 dgv.Rows[nowRow].Cells[3].Value = int.Parse.(frmItem.mtxtMoney.Text); 135 dgv.Rows[nowRow].Cells[4].Value = frmItem.txtRemarks.Text; 136 } 137 } 138 private void buttonChange_Click(object sender, EditorArgs e) 139 { 140 UpdateData(); 141 } 142 private void 変更CToolStripMenuItem_Click(object sender, EditorArgs e) 143 { 144 UpdateData(); 145 } 146 private void DeleteData() 147 { 148 int nowRow = DataGridView.CurrentRow.Index; 149 DataGridView.Rows.RemoveAt(nowRow); // 現在行を削除 150 } 151 private void buttonDelete_Click(object sender, EditorArgs e) 152 { 153 DeleteData(); 154 } 155 private void buttonChange_Click(object sender, EditorArgs e) 156 { 157 DeleteData(); 158 } 159 } 160} 161```家計簿アプリの作成をVisual StudioのC#で行なっております。 162Month Calendar でCSVに既に登録されている日付を選択できなくし、既に登録されている日付を選択するとメッセージボックスが表示されるようにしたいです。 163説明が不自由かも知れませんが、ご教示いただければと存じます。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

gentaro

2020/07/30 12:20

説明が不十分すぎます。 学習されているのであれば、これまで学習された知識を組み合わせて、ある程度どのように実装するのかの目処は立っているはずです。 まず自分がどのように実装をしようとしているのかを提示して、その中での不明点を挙げてください。 さもないと、これは質問ではなくただの丸投げにしかなりません。
Zuishin

2020/07/30 12:55 編集

起動時に CsvHelper で CSV を読み込んでオブジェクトのリストにし、そこから日付を取り出して HashSet を作ります。Monthly Caledar の選択イベントをハンドルして HashSet から選択された日付を探し、存在すればメッセージボックスを表示します。 説明が不自由かもしれませんが読み取ってください。
TN8001

2020/07/30 14:37

MonthCalendarには「選択していない状態」がなさそうで、 通常今日の日付が選択されていると思うのですが、今日が登録済みの場合次の日になるんでしょうか?(1か月先まで埋まっていても?^^; 範囲選択ができますが、登録日にかかったらどうなるのでしょう? いっそElementHostでWPFのCalendarを埋め込んだほうが簡単かもしれません(×で選択不可になるBlackoutDatesがあります)
guest

回答1

0

ElementHostに言及したので、簡単な例を回答します。

Calendar クラス (System.Windows.Controls) | Microsoft Docs

ElementHost クラス (System.Windows.Forms.Integration) | Microsoft Docs
でホストします。

既に登録されている日付を選択するとメッセージボックスが表示される

そもそも選択不可なのとダイアログをポンポン出すのは趣味でないので、「選択しないと登録ボタンが押せない」というシナリオにしました。

注意
以下を「参照の追加」で入れる必要があります。
PresentationCore
PresentationFramework
WindowsBase
WindowsFormsIntegration

日付選択後なぜかボタンを2回押す必要があります^^;
正確にはカレンダー以外のフォームのどこかをクリックしてからでないとボタンが反応しない。
解決法は探しきれませんでした。

cs

1using System; 2using System.Drawing; 3using System.Windows.Forms; 4using System.Windows.Forms.Integration; 5 6namespace Questions281450 7{ 8 public partial class Form1 : Form 9 { 10 private Button button1; 11 private System.Windows.Controls.Calendar calendar1; 12 13 public Form1() 14 { 15 InitializeComponent(); 16 17 button1 = new Button 18 { 19 Text = "登録", 20 Enabled = false, 21 Location = new Point(200, 330), 22 }; 23 button1.Click += (s, e) => MessageBox.Show($"{calendar1.SelectedDate?.ToString("yyyy/MM/dd")}を登録"); 24 Controls.Add(button1); 25 26 // [WPF]カレンダーコントロール 27 calendar1 = new System.Windows.Controls.Calendar 28 { 29 SelectedDate = null, 30 IsTodayHighlighted = false, 31 //SelectionMode = System.Windows.Controls.CalendarSelectionMode.SingleDate, 32 //FirstDayOfWeek = DayOfWeek.Sunday, 33 // 背景色・枠色以外の色変更は可能だが簡単ではない^^; 34 //Background = System.Windows.Media.Brushes.LightPink, 35 //BorderBrush = System.Windows.Media.Brushes.Blue, 36 37 }; 38 calendar1.SelectedDatesChanged += (s, _) => button1.Enabled = calendar1.SelectedDate != null; 39 40 foreach(var d in getCSV()) 41 { 42 // 選択不可日を追加 43 calendar1.BlackoutDates.Add(new System.Windows.Controls.CalendarDateRange(d)); 44 } 45 // 過去を一括選択不可にする 46 //calendar1.BlackoutDates.AddDatesInPast(); 47 48 // [WPF]中身を拡大縮小するコントロール(フォーム側でサイズ調整しやすいように) 49 var viewbox = new System.Windows.Controls.Viewbox 50 { 51 Stretch = System.Windows.Media.Stretch.Fill, 52 Child = calendar1, 53 }; 54 55 // [WinForms]WPFコントロールをフォームに追加するコントロール 56 var elementHost1 = new ElementHost 57 { 58 Child = viewbox, 59 Size = new Size(300, 300), 60 }; 61 Controls.Add(elementHost1); 62 } 63 64 // CSVから取得したつもりで 65 private DateTime[] getCSV() 66 { 67 var d = DateTime.Now.Date; 68 return new DateTime[] 69 { 70 d.AddDays(-7), 71 d.AddDays(-1), 72 d.AddDays(1), 73 d.AddDays(7), 74 }; 75 } 76 } 77}

アプリ画像

投稿2020/07/31 08:57

編集2023/07/22 10:06
TN8001

総合スコア9321

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問