|
分類:[C#]
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
int year = new int();
int month = new int();
int day = new int();
int dayOfWeek = 0;
int count = 0;
Label[] label_ptr = new Label[42];
/*今日の日付を取得*/
DateTime dt = DateTime.Now;
private void Form1_Load(object sender, EventArgs e)
{
int Month = DateTime.Today.Month;
label100.Text = Month.ToString() + "月";
MakeCarender(dt.Year,dt.Month,dt.Day);
}
/*カレンダー設定*/
private void MakeCarender(int year, int month, int day)
{
//アプリケーション起動時のみ
if (count == 0)
{
/*日付をセットする*/
year = dt.Year;
month = dt.Month;
day = dt.Day;
//dayOfWeek = dt.DayOfWeek.ToString();//曜日の取得
//Console.WriteLine("\n"+year+"年"+month+"月"+day+"日"+dayOfWeek+"\n");
}
/*月の日数を取得*/
int MaxDay = GetDays(year, month);
/*指定月の1日の曜日取得*/
int firstDayOfWeek = getDayOfWeek(year,month,1);
/*ラベルに日付の割り当て*/
/*一日までの空白の挿入*/
for (int i = 0; i < firstDayOfWeek; i++)
{
(label_ptr[i]).Text = i.ToString();
dayOfWeek++;
}
for (int i = 1; i <= MaxDay; i++)
{
(label_ptr[i]).Text = i.ToString();
dayOfWeek++;
if (dayOfWeek == 7)
{
//System.out.println();
dayOfWeek = 0;
}
}
}
/*日数計算*/
private int GetDays(int year, int month)
{
int days = 0;
switch (month)
{
case 2:
if (DateTime.IsLeapYear(year))
days = 29;
else
days = 28;
break;
case 4:
case 6:
case 9:
case 11:
days = 30;
break;
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
days = 31;
break;
}
//carender_make(year, month, days);
return days;
}
/*
* 指定した年月日の曜日を求める。戻り値と曜日の関係は
* 日曜日:0〜土曜日:6
*/
public static int getDayOfWeek(int year, int month, int day)
{
if (month <= 2)
{
month += 12;
year--;
}
int h = year / 100, y = year % 100;
// ツェラーの公式
int dayOfWeek = y + y / 4 + h / 4 - 2 * h + 13 * (month + 1) / 5 + day;
return (dayOfWeek + 6) % 7;
}
//先月ボタンを押したとき
private void button1_Click_1(object sender, EventArgs e)
{
int year3 = new int();
int month3 = new int();
if (month == 1)
{
year3 = year - 1;
month3 = 12;
}
else
{
year3 = year;
month3 = month - 1;
}
count++;
MakeCarender(year3, month3, day);
}
//来月ボタンを押したとき
private void button2_Click_1(object sender, EventArgs e)
{
int year4 = new int();
int month4 = new int();
if (month == 12)
{
year4 = year + 1;
month4 = 1;
}
else
{
year4 = year;
month4 = month + 1;
}
count++;
MakeCarender(year4, month4, day);
}
このようなソースのカレンダーツールを作ったのですが、
先月、来月はボタンで表示させ、
ラベルを42個用いて、そこに日にちを入れて表示させようとおもいました。
月初め(1日が入る)ラベルまでの前のラベルには空白を入れようとしたのですが
(label_ptr[i]).Text = i.ToString();の部分で
デバッガに引っかかりNullReferenceExceptionはハンドルされませんでしたというエラーが出ます…
対処方法がお分かりになる方はよろしくお願いします。
他にもカレンダーツールがおかしいというご指摘があればそこもよろしくお願いします。
|