初めに
前回の続きです
前回コメントで親切に教えて頂きありがとうございました!とても勉強になります!
まだまだ分からないことが多いので本当にうれしいです!
今回は子フォームのスケジュール表を作成するため、
カレンダーを表示するところまで投稿しようと思います。
手順.1【フォーム作成】
まずソリューションエクスプローラーからフォルダを作成します。(名前はforms)
そのフォルダ内にwindowsフォームクラスを追加します(今回はschedule.cs)
作成したら前回の親フォームのクリックイベント内の引数を下のように変更します!
OpenChildForm(new forms.schedule(), sender);
これでボタンをクリックしてスケジュールフォームを選択することができます
変更したら下のようにデザイナーを作成します!
※今後の処理に必要になるので、下にパネルを用意してます。
label1〜37,button1〜37のプロパティのvisibleをfalseにします。
label43の左のボタンがprevious、右がnextという名前です。
手順.2【コード作成】
まずカレンダーを表示するため、現在の日付を取得します。
その後、表示する必要があるボタンとラベルを判定します。
そして表示します。
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ファイル使用して下の画像のようにデータを入力したり、表示させたりするのでコードがややこしくなります(´;ω;`)
最後に
今回はできるだけわかりやすく簡潔にコードを書くのを意識して投稿しました!
もっと良い書き方など、知識を共有していただけると嬉しいです!
読んでいただきありがとうございました!