C#自作アプリ手順2　カレンダー【初心者】

### 初めに
前回の続きです

https://qiita.com/yama-is-bocchi/items/37e371eea05f75287b04

前回コメントで親切に教えて頂きありがとうございました!とても勉強になります!
まだまだ分からないことが多いので本当にうれしいです!

今回は子フォームのスケジュール表を作成するため、
カレンダーを表示するところまで投稿しようと思います。

![スクリーンショット 2023-12-15 135540.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3641815/7bc6216d-a611-76c6-254f-7b0a72505001.png)

### 手順.1【フォーム作成】

まずソリューションエクスプローラーからフォルダを作成します。(名前はforms)
そのフォルダ内にwindowsフォームクラスを追加します(今回はschedule.cs)
![スクリーンショット 2023-12-16 210628.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3641815/258f7acb-91a1-b267-fa5b-00926bfa3e41.png)
作成したら前回の親フォームのクリックイベント内の引数を下のように変更します!
 ```cs:親フォーム.cs
  OpenChildForm(new forms.schedule(), sender);
 ```
これでボタンをクリックしてスケジュールフォームを選択することができます
変更したら下のようにデザイナーを作成します!
※今後の処理に必要になるので、下にパネルを用意してます。
label1〜37,button1〜37のプロパティのvisibleをfalseにします。
label43の左のボタンがprevious、右がnextという名前です。

![スクリーンショット 2023-12-17 121750.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3641815/9815593f-325a-3650-c57c-5e45bb1c73b6.png)

### 手順.2【コード作成】

まずカレンダーを表示するため、現在の日付を取得します。
その後、表示する必要があるボタンとラベルを判定します。
そして表示します。

```cs:schedule.cs
namespace studyapp.forms
{
    public partial class schedule : Form
    {
        public schedule()
        {
            InitializeComponent();
            calender_output();//現在の日付にあたるカレンダーを表示
        }


        //フィールド
        private int button_st_num;//何番のボタンから表示されたか
        private int[] show_day = new int[37];//表示する日付用の配列
        private bool[] show_flag = new bool[37];//ボタン表示の判定用配列
        private DateTime cur_date = new DateTime(DateTime.Today.Year, DateTime.Today.Month, 1);//カレンダー表示してる日付 Date型


        private void calender_output()/*** 表示する必要のある年月データを配列に代入 ***/
        {
           // 当月1日からその曜日分だけ引きます。
           DateTime curDay = cur_date.AddDays(-(int)cur_date.DayOfWeek);
           bool first = false;//表示する月の一日を判定するフラグ
           int i = 0;
           do
           {
               if (i > 37)
               {
                   break;
               }
               if (curDay >= cur_date)//カレンダーの表示する
               {
                   if (first == false)
                   {
                       button_st_num = i + 1;//表示を始めるボタンの番号を追加します
                       first = true;
                   }

                   show_flag[i] = true;//表示をする必要のある番号をTRUEにします
                   show_day[i] = curDay.Day;//表示する日付を代入します
               }
               else
               {
                   show_flag[i] = false;
               }
               i++;
           } while ((curDay = curDay.AddDays(1.0)).Month ==cur_date.Month || curDay <= cur_date);

            calender_layout();//フィールドの配列をもとにボタンを表示する
        }

        
        private void calender_layout()/*** 配列のデータからウィンドウに出力 ***/
        {
            cur_m.Text = cur_date.ToString("yyyy/MM");//日付を表示            
           
            for (int i = 0; i < 37; i++)
            {
                if (show_flag[i] == true)//表示が必要なボタンを判定
                {
                    string s = "button" + (i + 1).ToString();
                    Control[] cs = this.Controls.Find(s, true);
                    if (cs.Length > 0)//sの名前のボタンが見つかればボタンを表示します
                    {
                        ((Button)cs[0]).Visible = true;//ボタンを表示
                    }
                    s = "label"+ (i + 1).ToString();
                    cs = this.Controls.Find(s, true);
                    if (cs.Length > 0)//sの名前のラベルがあればそこの日付にあたる日を表示ます。
                    {
                        ((Label)cs[0]).Visible = true;//ラベルを表示
                        ((Label)cs[0]).Text = show_day[i].ToString();

                    }

                }

            }

        }

        private void init_button_stack()/*** 配列、コントロール初期化 ***/
        {
            for (int i = 0; i < 37; i++)
            {
                if (show_flag[i] == true)
                {
                    string s = (i + 1).ToString();
                    s = "button" + s;

                    Control[] cs = this.Controls.Find(s, true);
                    if (cs.Length > 0)
                    {
                        ((Button)cs[0]).Visible = false;
                        ((Button)cs[0]).Text = "";
                    }

                    s = "label" + (i + 1).ToString();
                    cs = this.Controls.Find(s, true);
                    if (cs.Length > 0)
                    {
                        ((Label)cs[0]).Visible = false;

                    }
                    show_flag[i] = false;
                    show_day[i] = 0;
                }
                show_flag[i] = false;
                show_day[i] = 0;
            }
        }


        private void next_Click(object sender, EventArgs e)/*** 次の月に移動 ***/
        {
            init_button_stack();//現在表示してる日付のコントロールを初期化させます。
            if (Convert.ToInt32(cur_date.Month)+1 == 13)//年を越したか
            {
                cur_date = new DateTime(Convert.ToInt32(cur_date.Year) + 1, 1, 1); 
            }
            else
            {
                cur_date = new DateTime(Convert.ToInt32(cur_date.Year) , Convert.ToInt32(cur_date.Month) + 1, 1); 
            }
            calender_output();//更新したcur_dateでカレンダーを更新する
        }


        private void previous_Click(object sender, EventArgs e)/*** 前の月に移動 ***/
        {
            init_button_stack();//現在表示してる日付のコントロールを初期化させます。
            if (Convert.ToInt32(cur_date.Month) - 1 == 0)//年を越したか
            {
                cur_date = new DateTime(Convert.ToInt32(cur_date.Year) - 1, 12, 1);
            }
            else
            {
                cur_date = new DateTime(Convert.ToInt32(cur_date.Year), Convert.ToInt32(cur_date.Month) -1, 1);
            }
            calender_output();//更新したcur_dateでカレンダーを更新する
        }
    }
}
```

とりあえずこれでカレンダーと同じ形式でボタンを表示させることができると思います。
ここからCSVファイル使用して下の画像のようにデータを入力したり、表示させたりするのでコードがややこしくなります(´;ω;｀)
![スクリーンショット 2023-12-17 191601.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3641815/b05f8501-f419-749e-229b-cda0d06036a2.png)

![スクリーンショット 2023-12-15 135557.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3641815/6067c3f0-1f65-03dc-ed56-13a933ecbc52.png)
次回はそのコードを書いていきます!

### 最後に
今回はできるだけわかりやすく簡潔にコードを書くのを意識して投稿しました!
もっと良い書き方など、知識を共有していただけると嬉しいです!
読んでいただきありがとうございました!