1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

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

Posted at

初めに

前回の続きです

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

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

スクリーンショット 2023-12-15 135540.png

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

まずソリューションエクスプローラーからフォルダを作成します。(名前はforms)
そのフォルダ内にwindowsフォームクラスを追加します(今回はschedule.cs)
スクリーンショット 2023-12-16 210628.png
作成したら前回の親フォームのクリックイベント内の引数を下のように変更します!

親フォーム.cs
 OpenChildForm(new forms.schedule(), sender);

これでボタンをクリックしてスケジュールフォームを選択することができます
変更したら下のようにデザイナーを作成します!
※今後の処理に必要になるので、下にパネルを用意してます。
label1〜37,button1〜37のプロパティのvisibleをfalseにします。
label43の左のボタンがprevious、右がnextという名前です。

スクリーンショット 2023-12-17 121750.png

手順.2【コード作成】

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

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

スクリーンショット 2023-12-15 135557.png
次回はそのコードを書いていきます!

最後に

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

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?