Rambler's Top100
Главная
Новости
Статьи
Форумы
Книги
Коды
Сообщество
Блоги
О нас
 

Логин

Email:
  Пароль:

Войти
Зарегистрироваться
Забыл пароль

Поиск

 Искать :
 
Вперед

Книги по теме

Искать:
в:
Порядок:

Исходник

Автор:

[NSU]The_Cjay

 
Название:

ListCalendar

Дата: 30 July 2008
Описание: Календарь с подсветкой определенных дат. Начальная версия для коммерческого проекта для просмотра времени "незанятости" объектов. Зеленый - свободно, красный - занято, желтый - возможно свободно. Используйте функцию AddHighlightDateSpan( new DateSpan(...), new DateSpan(..)) для добавления посвечиваемых диапазонов дат. Комментарии и нововведения приветствуются. 
  Разместить ссылку на этот исходник в форуме вы можете вставив в текст сообщения следующую строку: [CODEPOST ID=234]ListCalendar [/CODEPOST]
Оценить:
  1 using System;
  2 using System.Collections;
  3 using System.Collections.Generic;
  4 using System.Globalization;
  5 using System.Web.UI;
  6 using System.Web.UI.WebControls;
  7 
  8 /// <summary>
  9 /// Summary description for ListCalendar
 10 /// </summary>
 11 namespace ILM
 12 {
 13     [ToolboxData("<{0}:ListCalendar runat=server></{0}:ListCalendar>")]
 14     public class ListCalendar : WebControl, IPostBackEventHandler
 15     {
 16         public ListCalendar()
 17         {
 18             ViewState["DatesList"] = new List<DateSpan>();
 19         }
 20         protected override HtmlTextWriterTag TagKey
 21         {
 22             get { return HtmlTextWriterTag.Div; }
 23         }
 24 
 25 
 26         private List<DateSpan> Dates
 27         {
 28             get
 29             {
 30                 object o = ViewState["DatesList"];
 31                 if (o != null) return (List<DateSpan>)o;
 32                 return new List<DateSpan>();
 33             }
 34         }
 35 
 36         public DateTime StartDisplayDateTime
 37         {
 38             get
 39             {
 40                 object o = ViewState["_StartDisplayDateTime"];
 41                 if (o != null) return (DateTime)o;
 42                 return DateTime.Today;
 43             }
 44             set
 45             {
 46                 ViewState["_StartDisplayDateTime"] = value;
 47             }
 48         }
 49 
 50         public DateRange DisplayDatesFrequency
 51         {
 52             get
 53             {
 54                 object o = ViewState["DisplayDatesFrequency"];
 55                 return o == null ? DateRange.Day15Minutes : (DateRange)o;
 56             }
 57             set { ViewState["DisplayDatesFrequency"] = value; }
 58         }
 59 
 60         private string _BusyDayCssClass;
 61         private string _FreeDayCssClass;
 62 
 63         public string BusyDayCssClass
 64         {
 65             get { return _BusyDayCssClass; }
 66             set { _BusyDayCssClass = value; }
 67         }
 68 
 69         public string FreeDayCssClass
 70         {
 71             get { return _FreeDayCssClass; }
 72             set { _FreeDayCssClass = value; }
 73         }
 74 
 75         public string HoverBusyDayCssClass
 76         {
 77             get { return _HoverBusyDayCssClass; }
 78             set { _HoverBusyDayCssClass = value; }
 79         }
 80 
 81         public string HoverFreeDayCssClass
 82         {
 83             get { return _HoverFreeDayCssClass; }
 84             set { _HoverFreeDayCssClass = value; }
 85         }
 86 
 87         private string _HoverBusyDayCssClass;
 88         private string _HoverFreeDayCssClass;
 89 
 90         public string TableCssClass
 91         {
 92             get { return _TableCssClass; }
 93             set { _TableCssClass = value; }
 94         }
 95 
 96         private string _TableCssClass;
 97         private string _UnknownDayCssClass;
 98         private string _HoverUnknownDayCssClass;
 99 
100         public string UnknownDayCssClass
101         {
102             get { return _UnknownDayCssClass; }
103             set { _UnknownDayCssClass = value; }
104         }
105 
106         public string HoverUnknownDayCssClass
107         {
108             get { return _HoverUnknownDayCssClass; }
109             set { _HoverUnknownDayCssClass = value; }
110         }
111 
112         public string InactiveDayCssClass
113         {
114             get { return _InactiveDayCssClass; }
115             set { _InactiveDayCssClass = value; }
116         }
117 
118         private string _InactiveDayCssClass;
119         private string _HeaderCssClass;
120         private string _HoverHeaderCssClass;
121 
122         public string HeaderCssClass
123         {
124             get { return _HeaderCssClass; }
125             set { _HeaderCssClass = value; }
126         }
127 
128         public string HoverHeaderCssClass
129         {
130             get { return _HoverHeaderCssClass; }
131             set { _HoverHeaderCssClass = value; }
132         }
133 
134         public string NavigationButtonCssClass
135         {
136             get { return _NavigationButtonCssClass; }
137             set { _NavigationButtonCssClass = value; }
138         }
139 
140         public string HoverNavigationButtonCssClass
141         {
142             get { return _HoverNavigationButtonCssClass; }
143             set { _HoverNavigationButtonCssClass = value; }
144         }
145 
146         private string _NavigationButtonCssClass;
147         private string _HoverNavigationButtonCssClass;
148 
149 
150         protected override void Render(HtmlTextWriter writer)
151         {
152             base.Render(writer);
153             RenderHeader(writer);
154             writer.AddAttribute(HtmlTextWriterAttribute.Class, _TableCssClass);
155             writer.RenderBeginTag(HtmlTextWriterTag.Table);
156             int month = StartDisplayDateTime.Month;
157             DateTime startDate = GetStartDisplayDate(StartDisplayDateTime);
158             TimeSpan range = GetIncrement();
159 
160             switch (DisplayDatesFrequency)
161             {
162                 case DateRange.Day15Minutes:
163                     for (int i = 0; i < 23; i++)
164                     {
165                         writer.RenderBeginTag(HtmlTextWriterTag.Tr);
166                         RenderCell(startDate, range, writer);
167                         startDate = startDate.Add(range);
168                         writer.RenderEndTag();
169                     }
170                     break;
171                 case DateRange.Day30Minutes:
172                     for (int i = 0; i < 23; i++)
173                     {
174                         writer.RenderBeginTag(HtmlTextWriterTag.Tr);
175                         RenderCell(startDate, range, writer);
176                         startDate = startDate.Add(range);
177                         writer.RenderEndTag();
178                     }
179                     break;
180                 case DateRange.DayHour:
181                     for (int i = 0; i < 24; i++)
182                     {
183                         writer.RenderBeginTag(HtmlTextWriterTag.Tr);
184                         RenderCell(startDate, range, writer);
185                         writer.RenderEndTag();
186                         startDate = startDate.Add(range);
187                     }
188                     break;
189                 case DateRange.Month:
190                     bool switcher = false;
191                     for (int i = 0; i < 6; i++)
192                     {
193                         
194                         writer.RenderBeginTag(HtmlTextWriterTag.Tr);
195                         for (int j = 0; j < 7; j++)
196                         {
197                             if (startDate.Day == 1) switcher = !switcher;
198                             if ((i>2)&&(!switcher)) break;
199                             if (switcher) RenderCell(startDate, range, writer, startDate.Day.ToString());
200                             else RenderCell(startDate, range, writer, " ");
201                             startDate = startDate.Add(range);
202                         }
203                         writer.RenderEndTag();
204                         if ((i > 2) && (!switcher)) break;
205                     }
206                     break;
207                 case DateRange.Week:
208 
209                     for (int i = 0; i < 7; i++)
210                     {
211                         writer.RenderBeginTag(HtmlTextWriterTag.Tr);
212                         RenderCell(startDate, range, writer, startDate.DayOfWeek.ToString());
213                         startDate = startDate.Add(range);
214                         writer.RenderEndTag();
215                     }
216 
217                     break;
218             }
219             writer.RenderEndTag();
220         }
221         private void RenderFreeCell(HtmlTextWriter writer, string innerText)
222         {
223             writer.AddAttribute(HtmlTextWriterAttribute.Class, _FreeDayCssClass);
224             writer.AddAttribute("OnMouseMove", "this.className = '" + _HoverFreeDayCssClass + "'");
225             writer.AddAttribute("OnMouseOut", "this.className = '" + _FreeDayCssClass + "'");
226             writer.AddAttribute(HtmlTextWriterAttribute.Valign, "center");
227             writer.RenderBeginTag(HtmlTextWriterTag.Td);
228             writer.WriteLine(innerText);
229             writer.RenderEndTag();
230 
231         }
232         private void RenderBusyCell(HtmlTextWriter writer, string innerText)
233         {
234             writer.AddAttribute(HtmlTextWriterAttribute.Class, _BusyDayCssClass);
235             writer.AddAttribute("OnMouseMove", "this.className = '" + _HoverBusyDayCssClass + "'");
236             writer.AddAttribute("OnMouseOut", "this.className = '" + _BusyDayCssClass + "'");
237             writer.AddAttribute(HtmlTextWriterAttribute.Valign, "center");
238             writer.RenderBeginTag(HtmlTextWriterTag.Td);
239             writer.WriteLine(innerText);
240             writer.RenderEndTag();
241         }
242         private void RenderUnknownCell(HtmlTextWriter writer, string innerText, DateTime onClickShowDate)
243         {
244             writer.AddAttribute(HtmlTextWriterAttribute.Class, _UnknownDayCssClass);
245             writer.AddAttribute("OnMouseMove", "this.className = '" + _HoverUnknownDayCssClass + "'");
246             writer.AddAttribute("OnMouseOut", "this.className = '" + _UnknownDayCssClass + "'");
247             writer.AddAttribute(HtmlTextWriterAttribute.Onclick, Page.ClientScript.GetPostBackEventReference(this, "deeper|" + onClickShowDate.ToBinary().ToString()));
248             writer.AddAttribute(HtmlTextWriterAttribute.Valign, "center");
249             writer.RenderBeginTag(HtmlTextWriterTag.Td);
250             writer.WriteLine(innerText);
251             writer.RenderEndTag();
252         }
253 
254         public void RaisePostBackEvent(string eventArgument)
255         {
256             if (eventArgument == "next") Navigate(1);
257             else if (eventArgument == "prev") Navigate(-1);
258             else if (eventArgument == "upper") NavigateUpper();
259             else if (eventArgument.StartsWith("deeper"))
260             {
261                 long binaryDate = long.Parse(eventArgument.Substring(eventArgument.IndexOf('|') + 1));
262                 DateTime d = DateTime.FromBinary(binaryDate);
263                 NavigateDeeper(d);
264             }
265 
266         }
267         private void RenderCell(DateTime startDate, TimeSpan range, HtmlTextWriter writer)
268         {
269             DateTime endDate = startDate;
270             endDate = endDate.Add(range);
271 
272             IEnumerator en = Dates.GetEnumerator();
273             en.Reset();
274             int c = 0;
275             DateSpan cur;
276             while (en.MoveNext())
277             {
278                 cur = (DateSpan)en.Current;
279                 c += GetJoinDegree(new DateSpan(startDate, endDate), cur);
280                 if (c == 2) break;
281             }
282             switch (c)
283             {
284                 case (0):
285                     RenderFreeCell(writer, startDate.ToShortTimeString());
286                     break;
287                 case (1):
288                     RenderBusyCell(writer, startDate.ToShortTimeString());
289                     break;
290                 default:
291                     RenderUnknownCell(writer, startDate.ToShortTimeString(), startDate);
292                     break;
293 
294             }
295             en.Reset();
296         }
297         private void RenderCell(DateTime startDate, TimeSpan range, HtmlTextWriter writer, string cellText)
298         {
299             DateTime endDate = startDate;
300             endDate = endDate.Add(range);
301 
302             IEnumerator en = Dates.GetEnumerator();
303             en.Reset();
304             int c = 0;
305             DateSpan cur;
306             while (en.MoveNext())
307             {
308                 cur = (DateSpan)en.Current;
309                 c += GetJoinDegree(new DateSpan(startDate, endDate), cur);
310                 if (c == 2) break;
311             }
312             switch (c)
313             {
314                 case (0):
315                     RenderFreeCell(writer, cellText);
316                     break;
317                 case (1):
318                     RenderBusyCell(writer, cellText);
319                     break;
320                 default:
321                     RenderUnknownCell(writer, cellText, startDate);
322                     break;
323 
324             }
325 
326         }
327         private void Navigate(int steps)
328         {
329             switch (DisplayDatesFrequency)
330             {
331                 case DateRange.Day15Minutes:
332                 case DateRange.Day30Minutes:
333                 case DateRange.DayHour:
334                     StartDisplayDateTime = StartDisplayDateTime.Add(new TimeSpan(steps * 1, 0, 0, 0));
335                     break;
336                 case DateRange.Month:
337                     StartDisplayDateTime = StartDisplayDateTime.AddMonths(steps*1);
338                     break;
339                 case DateRange.Week:
340                     StartDisplayDateTime = StartDisplayDateTime.Add(new TimeSpan(steps * 7, 0, 0, 0));
341                     break;
342             }
343         }
344         private void NavigateDeeper(DateTime d)
345         {
346             StartDisplayDateTime = d;
347             switch (DisplayDatesFrequency)
348             {
349                 case DateRange.Day15Minutes:
350                     break;
351                 case DateRange.Day30Minutes:
352                     DisplayDatesFrequency = DateRange.Day15Minutes;
353                     break;
354                 case DateRange.DayHour:
355                     DisplayDatesFrequency = DateRange.Day30Minutes;
356                     break;
357                 case DateRange.Month:
358                     DisplayDatesFrequency = DateRange.DayHour;
359                     break;
360                 case DateRange.Week:
361                     DisplayDatesFrequency = DateRange.DayHour;
362                     break;
363             }
364         }
365         private void NavigateUpper()
366         {
367             switch (DisplayDatesFrequency)
368             {
369                 case DateRange.Day15Minutes:
370                     DisplayDatesFrequency = DateRange.Day30Minutes;
371                     break;
372                 case DateRange.Day30Minutes:
373                     DisplayDatesFrequency = DateRange.DayHour;
374                     break;
375                 case DateRange.DayHour:
376                     DisplayDatesFrequency = DateRange.Week;
377                     break;
378                 case DateRange.Month:
379                     break;
380                 case DateRange.Week:
381                     DisplayDatesFrequency = DateRange.Month;
382                     break;
383             }
384         }
385         private DateTime GetStartDisplayDate(DateTime d)
386         {
387             switch (DisplayDatesFrequency)
388             {
389                 case DateRange.Day15Minutes:
390                     return d;
391                 case DateRange.Day30Minutes:
392                     return d;
393                 case DateRange.DayHour:
394                     return new DateTime(d.Year, d.Month, d.Day, 0, 0, 0, DateTimeKind.Local);
395                 case DateRange.Month:
396                     return d.AddDays(0 - Convert.ToInt32(d.DayOfWeek)+1);
397                 case DateRange.Week:
398                     return d.AddDays(0 - Convert.ToInt32(d.DayOfWeek)+1);
399             }
400             return new DateTime();
401         }
402         private TimeSpan GetIncrement()
403         {
404             switch (DisplayDatesFrequency)
405             {
406                 case DateRange.Day15Minutes:
407                     return new TimeSpan(0, 15, 0);
408                 case DateRange.Day30Minutes:
409                     return new TimeSpan(0, 30, 0);
410                 case DateRange.DayHour:
411                     return new TimeSpan(1, 0, 0);
412                 case DateRange.Month:
413                     return new TimeSpan(1, 0, 0, 0);
414                 case DateRange.Week:
415                     return new TimeSpan(1, 0, 0, 0);
416             }
417             return new TimeSpan();
418         }
419         private void RenderHeader(HtmlTextWriter writer)
420         {
421             writer.AddAttribute(HtmlTextWriterAttribute.Class, _TableCssClass);
422             writer.RenderBeginTag(HtmlTextWriterTag.Table);
423             writer.RenderBeginTag(HtmlTextWriterTag.Tr);
424 
425             writer.AddAttribute(HtmlTextWriterAttribute.Onclick, Page.ClientScript.GetPostBackEventReference(this, "prev"));
426             writer.AddAttribute(HtmlTextWriterAttribute.Class, _NavigationButtonCssClass);
427             writer.AddAttribute("OnMouseMove", "this.className = '" + _HoverNavigationButtonCssClass + "'");
428             writer.AddAttribute("OnMouseOut", "this.className = '" + _NavigationButtonCssClass + "'");
429             writer.AddAttribute(HtmlTextWriterAttribute.Align, "center");
430             writer.RenderBeginTag(HtmlTextWriterTag.Td);
431 
432             writer.Write("<");
433             writer.RenderEndTag();
434             writer.AddAttribute(HtmlTextWriterAttribute.Onclick, Page.ClientScript.GetPostBackEventReference(this, "upper"));
435             writer.AddAttribute(HtmlTextWriterAttribute.Class, _HeaderCssClass);
436             writer.AddAttribute("OnMouseMove", "this.className = '" + _HoverHeaderCssClass + "'");
437             writer.AddAttribute("OnMouseOut", "this.className = '" + _HeaderCssClass + "'");
438             writer.AddAttribute(HtmlTextWriterAttribute.Align, "center");
439             writer.RenderBeginTag(HtmlTextWriterTag.Td);
440             switch (DisplayDatesFrequency)
441             {
442                 case DateRange.Day15Minutes:
443                 case DateRange.Day30Minutes:
444                     writer.Write(StartDisplayDateTime.ToLongDateString());
445                     break;
446                 case DateRange.DayHour:
447                     writer.Write(StartDisplayDateTime.ToLongDateString());
448                     break;
449                 case DateRange.Month:
450                 case DateRange.Week:
451                     writer.Write(StartDisplayDateTime.ToString("MMMM", CultureInfo.CurrentCulture));
452                     break;
453             }
454             writer.RenderEndTag();
455             writer.AddAttribute(HtmlTextWriterAttribute.Align, "center");
456             writer.AddAttribute(HtmlTextWriterAttribute.Onclick, Page.ClientScript.GetPostBackEventReference(this, "next"));
457             writer.AddAttribute(HtmlTextWriterAttribute.Class, _NavigationButtonCssClass);
458             writer.AddAttribute("OnMouseMove", "this.className = '" + _HoverNavigationButtonCssClass + "'");
459             writer.AddAttribute("OnMouseOut", "this.className = '" + _NavigationButtonCssClass + "'");
460             writer.RenderBeginTag(HtmlTextWriterTag.Td);
461             writer.Write(">");
462             writer.RenderEndTag();
463 
464             writer.RenderEndTag();
465             writer.RenderEndTag();
466             
467         }
468         public void AddHighlightDateSpan(DateSpan d)
469         {
470             Dates.Add(d);
471         }
472         private int GetJoinDegree(DateSpan table,DateSpan date)
473         {
474             if ((date.End <= table.Start) || (date.Start >= table.End)) return 0;
475             if ((date.Start <= table.Start) && (date.End >= table.End)) return 1;
476             return 2;
477         }
478 
479 
480     }
481 
482 
483     public enum DateRange
484     {
485         Day15Minutes = 0,
486         Day30Minutes,
487         DayHour,
488         Week,
489         Month
490     }
491 
492     public class DateSpan
493     {
494         public DateTime Start
495         {
496             get { return start; }
497             set { start = value; }
498         }
499 
500         public DateTime End
501         {
502             get { return end; }
503             set { end = value; }
504         }
505 
506         private DateTime start;
507         private DateTime end;
508         public DateSpan(DateTime startDate, DateTime endDate)
509         {
510             start = startDate;
511             end = endDate;
512         }
513     }
514 }
Вернуться к списку исходников в категории Создание элементов управления
 
Наш Киев

Apartments for Rent

Rambler's Top100
Рейтинг@Mail.ru
Идея: Dimon aka Manowar Программирование: Dimon aka Manowar Дизайн: Dan Lebedev
Хостинг от компании Parking.ru
Карта сайта