2009-04-19 4 views
3

年の12ヶ月をカレンダー形式で表示するMVC Webページを作成したいと考えています。その月の毎日のうちに、何らかの活動(データベースからのデータ)がある日付だけを太字で表示します。アクティビティの日付も/ Activity/2008/12/25のようなルートにハイパーリンクされていますasp.net mvcのカスタムハイパーリンクを含む暦年を表示

私はasp.net ajaxコントロールツールキットのカレンダーコントロールを試そうとしていますが、 。

答えて

6

カレンダーのレンダリングは非常に複雑ではありません。 System.Globalizationおよび日時でのDateTimeFormatInfoを使用して、すべての必要な情報を取得することができる。

  • DateTimeFormatInfo.CurrentInfo.FirstDayOfWeek
  • DateTimeFormatInfo.CurrentInfo.GetMonthName(月)
  • DateTimeFormatInfo.CurrentInfo.GetAbbreviatedDayName((

    _ _ _ 1 2 3 4 
    5 6 7 8 9 ... 
    
    :のDayOfWeek)dayNumber)

カレンダーの月は、表にレンダリングすることができますそこに最大31日は月にあり、初めで最大6個の空のセル、月が上にレンダリングされるように

DateTime date = new DateTime(year, month, 1); 
int emptyCells = ((int)date.DayOfWeek + 7 
    - (int)DateTimeFormatInfo.CurrentInfo.FirstDayOfWeek) % 7; 

:このような初め何かが使用可能で、空のセルの数をdermineする

最大Ceil(37/7)= 6行。したがって、1ヶ月に最大42個のセルがレンダリングされ、そのうちのいくつかは空になります。

新しい行が7(各セルの日数)のセルに挿入されます。日付が活性とされている場合

int days = DateTime.DaysInMonth(year, month); 
for (int i = 0; i != 42; i++) 
{ 
    if (i % 7 == 0) { 
     writer.WriteLine("<tr>"); 
     if(i > 0) writer.WriteLine("</tr>"); 
    } 

    if (i < emptyCells || i >= emptyCells + days) { 
     writer.WriteLine("<td class=\"cal-empty\">&nbsp;</td>"); 
    } else { 
     writer.WriteLine("<td class=\"cal-day\"\">" + date.Day + "</td>"); 
     date = date.AddDays(1); 
    } 
} 

また、単に所望の経路に非空のセルに追加のリンクを追加します。

+0

私はあなたの推薦に行くことになった。たくさんのコントロールがありますが、なんらかの理由でこれが簡単になるはずです。ああ、あなたはint days = DateTime.DaysInMonth(年、月)を忘れてしまった。応答していただきありがとうございます。 – Mouffette

+0

はい、あなたは正しいです。私は同じ方法を感じ、その後私は年間のカレンダーを実装する必要があるたびにこれに戻って来ることがわかった:) – Aleris

+0

サンプル実装ありがとう。しかし、そこにはエラーがあります。日付= date.AddDays(1)は最後に入ります。それ以外の場合は、空のセルがレンダリングされても日付が増えます。したがって、2009年5月には最初の5つが欠落しています事実上すべての日付が間違っています。 –

関連する問題