カレンダー付箋ボード

カレンダーと付箋ボードのWindowsアプリ完成!

詳細はこちら

【C#】便利機能付きカレンダー作成。その5。もう少しで完成!?

毎日コツコツ作りつづけて約半年。いや~半年かかってもまだ完成しない(泣)前回からの修正へ変更、新規追加などがかなりあり想定より時間がかかっています。

日本祝日の取得方法を変更

まずは祝日設定を民間の個人サイトから取得していましたが
内閣府の祝日csvから取得するように修正しました。

理由は個人サイトだといつ閉鎖されるか?わからないこと。
内閣府なら正確だし、安心なので。

    //祝日設定
    public class Japanholidaydata
    {
        private const string HolidaysFilePath = "japanholiday.json";
        private const string CsvUrl = "https://www8.cao.go.jp/chosei/shukujitsu/syukujitsu.csv"; // 政府の公式CSV URL
        private static readonly HttpClient httpClient = new();
        private static readonly JsonSerializerOptions jsonOptions = new() { WriteIndented = true };
        private static readonly string[] LineSeparators = { "\r\n", "\n" };

        public class PublicHoliday
        {
            public DateTime Date { get; set; }   //日付
            public string? LocalName { get; set; } //ローカル名
        }

内閣府のCSVから日付と祝日名を取得します。(コードの一部)

        private static async Task UpdateFutureHolidays() 
        {
            var allHolidays = Japanholidaydata.LoadHolidaysFromFile(HolidaysFilePath);
            var lastUpdate = File.GetLastWriteTime(HolidaysFilePath); 
            if ((DateTime.Now - lastUpdate).TotalDays > 90)
            {
                try
                {
                    var futureHolidays = await FetchHolidaysFromCSV();
                    AddHolidaysToList(allHolidays, futureHolidays);
                    SaveHolidaysToFile(allHolidays);
                }
                catch (Exception)
                {
                    allHolidays = Japanholidaydata.LoadHolidaysFromFile(HolidaysFilePath); 
                } 
            }

更新部分。最終更新日から90日以上経過していた場合は
更新をして保存します。
ネットに接続できなかった場合はローカルに保存してある
祝日データを使います。

テキストボックスをリッチテキストボックスへ

グリッドセルはテキストボックスになっています。
これをリッチテキストボックスに変更します。
が・・・これがすご~く難しい。

まずはテキストボックスとリッチテキストボックスの違い。
セル内(テキストボックス)は文字装飾は1つしか設定で
きません。なので文字色も1色のみ。
特定の文字のみ色を変更するということができないのです。

リッチテキストボックスは文字単位で設定することができ
同じセル内でも特定の文字色を変更して目立たせることが
できます。
ただしその分設定やら保存やら面倒です。

こんな感じです。
リッチテキストボックスにするとこのように特定の文字色を
変えることができます。
もちろん、文字の大きさ、スタイルも変更できます。
これで重要なスケジュールのときは目立たせることが
できます。

これはカスタムセルといってリッチテキストボックスを
カスタム作成してそれをペイントで描画しています。

リッチテキストボックスの保存は文字情報も含むため
特殊になりrtf形式で保存しています。

        protected override void Paint(Graphics graphics, Rectangle clipBounds, Rectangle cellBounds, int rowIndex, 
            DataGridViewElementStates cellState, object? value, object? formattedValue, string? errorText, DataGridViewCellStyle 
            cellStyle, DataGridViewAdvancedBorderStyle advancedBorderStyle, DataGridViewPaintParts paintParts)
        {
            // 基本のセル描画
            base.Paint(graphics, clipBounds, cellBounds, rowIndex, cellState, value, formattedValue, errorText, cellStyle, advancedBorderStyle, paintParts);

            try
            {
                // リッチテキストの描画
                using (RichTextBox rtb = new())
                {
                    rtb.Width = cellBounds.Width;
                    rtb.Height = cellBounds.Height;
                    //rtb.BorderStyle = BorderStyle.FixedSingle; 
                    rtb.Rtf = value as string ?? string.Empty;
                    //Debug.WriteLine("描画前rtb.Rtf: " + rtb.Rtf);

ペイント部分(リッチテキストボックスを描画するコード一部)になります。

セル内設定(作成中)

セル内を右クリックでメニューを出す。
そこで文字色やスタイルを設定できる画面とコードを
作っています。

背景色やボタン色はテーマに沿った色をチョイス。
(デザインセンスがまるでないのがわかりますね)

リッチテキストボックスを使用するため、選択文字の
文字装飾とセル内の文字装飾をわけて設定できるよ
うにしようと思っています。

まとめ

C#初心者ですが、毎日コツコツやってなんとか
ここまでたどりつきました!

それにしてもリッチテキストボックスが難しい!
カスタムセルってなんやねん!
rtfってなんやねん!

あと少しだと思うんだよな~
(3か月前にも言っている)