|
|
|
 |
 |
Исходник |
 |
|
 |
 |
|
Автор:
|
|
|
Название:
|
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 } |
| Вернуться к списку исходников в категории Создание элементов управления |
|
|
 |
 |
 |
 |
|
|