protected void rptEvents_ItemDataBound(object sender, RepeaterItemEventArgs e) { if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem) { string[] myDateTimePatterns = new string[] { "MM/dd/yy", "MM/dd/yyyy" }; CultureInfo ci = new CultureInfo("pt-BR"); DateTimeFormatInfo dtfi = ci.DateTimeFormat; cEvent item = (cEvent)e.Item.DataItem; Literal ltMonth = (Literal)e.Item.FindControl("ltMonth"); ltMonth.Text = dtfi.AbbreviatedMonthGenitiveNames[item.dateInit.Month - 1].ToUpper(); Literal ltDay = (Literal)e.Item.FindControl("ltDay"); ltDay.Text = String.Format("{0:dd}", item.dateInit); Literal ltEvent = (Literal)e.Item.FindControl("ltEvent"); ltEvent.Text = item.name; Literal ltHour = (Literal)e.Item.FindControl("ltHour"); ltHour.Text = String.Format("{0:HH:mm}", item.dateInit) + (item.dateFinish.HasValue ? " - " + String.Format("{0:HH:mm}", item.dateFinish.Value) : ""); HyperLink hyEvent = (HyperLink)e.Item.FindControl("hyEvent"); hyEvent.Text = "Assista"; hyEvent.Attributes.Add("href", item.url); } }
protected void rptVideos_ItemDataBound(object sender, RepeaterItemEventArgs e) { if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem) { cEvent item = (cEvent)e.Item.DataItem; Panel pnVideo = (Panel)e.Item.FindControl("pnVideo"); if (e.Item.ItemIndex == 0) { pnVideo.CssClass = "item active"; } else { pnVideo.CssClass = "item"; } Literal ltVideo = (Literal)e.Item.FindControl("ltVideo"); ltVideo.Text = "<iframe class='video-iframe' src='" + item.url + "' frameborder='0' allowfullscreen=''></iframe>"; } }
protected void rptEvents_ItemDataBound(object sender, RepeaterItemEventArgs e) { if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem) { string[] myDateTimePatterns = new string[] { "MM/dd/yy", "MM/dd/yyyy" }; CultureInfo ci = new CultureInfo("pt-BR"); DateTimeFormatInfo dtfi = ci.DateTimeFormat; cEvent item = (cEvent)e.Item.DataItem; Literal ltMonth = (Literal)e.Item.FindControl("ltMonth"); ltMonth.Text = dtfi.AbbreviatedMonthGenitiveNames[item.dateInit.Month - 1].ToUpper(); Literal ltDay = (Literal)e.Item.FindControl("ltDay"); ltDay.Text = String.Format("{0:dd}", item.dateInit); Literal ltEvent = (Literal)e.Item.FindControl("ltEvent"); ltEvent.Text = item.name; Literal ltHour = (Literal)e.Item.FindControl("ltHour"); ltHour.Text = String.Format("{0:HH:mm}", item.dateInit) + (item.dateFinish.HasValue ? " - " + String.Format("{0:HH:mm}", item.dateFinish.Value) : ""); HyperLink hyEvent = (HyperLink)e.Item.FindControl("hyEvent"); hyEvent.Text = "Assista"; hyEvent.Attributes.Add("video", item.url); Literal ltDescription = (Literal)e.Item.FindControl("ltDescription"); ltDescription.Text = item.description; if (e.Item.ItemIndex == 0) { Literal ltVideo = (Literal)e.Item.FindControl("ltVideo"); ltVideo.Text = "<iframe class=\"iframe urlFeaturedEvent\" frameborder=\"0\" allowfullscreen=\"\"></iframe>"; hddUrlFeaturedEvent.Value = item.url; } } }
// 이미지 요청 internal Bitmap RequestImage() { const int cellHourWidth = 60; const int cellHourHeight = 30; var bmp = new Bitmap(ClientSize.Width, cellHourWidth * 24); Graphics g = Graphics.FromImage(bmp); g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAliasGridFit; var dt = new DateTime(_calendarDate.Year, _calendarDate.Month, _calendarDate.Day, 0, 0, 0); int xStart = 0; int yStart = 0; g.DrawRectangle(Pens.Black, 0, 0, ClientSize.Width - MarginSize * 2 - 2, cellHourHeight * 24); for (int i = 0; i < 24; i++) { var textWidth = (int)g.MeasureString(dt.ToString("htt").ToLower(), _dayViewTimeFont).Width; g.DrawRectangle(Pens.Black, xStart, yStart, cellHourWidth, cellHourHeight); g.DrawLine(Pens.Black, xStart + cellHourWidth, yStart + cellHourHeight, ClientSize.Width - MarginSize * 2 - 3, yStart + cellHourHeight); g.DrawLine(Pens.DarkGray, xStart + cellHourWidth, yStart + cellHourHeight / 2, ClientSize.Width - MarginSize * 2 - 3, yStart + cellHourHeight / 2); g.DrawString(dt.ToString("htt").ToLower(), _dayViewTimeFont, Brushes.Black, xStart + cellHourWidth - textWidth, yStart); yStart += cellHourHeight; dt = dt.AddHours(1); } dt = new DateTime(_calendarDate.Year, _calendarDate.Month, _calendarDate.Day, 23, 59, 0); List<IEvent> evnts = _events.Where(evnt => NeedsRendering(evnt, dt)).ToList().OrderBy(d => d.Date).ToList(); xStart = cellHourWidth + 1; yStart = 0; g.Clip = new Region(new Rectangle(0, 0, ClientSize.Width - MarginSize * 2 - 2, cellHourHeight * 24)); _cEvents.Clear(); for (int i = 0; i < 24; i++) { dt = new DateTime(_calendarDate.Year, _calendarDate.Month, _calendarDate.Day, 0, 0, 0); dt = dt.AddHours(i); foreach (var evnt in evnts) { TimeSpan ts = TimeSpan.FromHours(evnt.EventLengthInHours); if (evnt.Date.Ticks >= dt.Ticks && evnt.Date.Ticks < dt.Add(ts).Ticks && evnt.EventLengthInHours > 0 && i >= evnt.Date.Hour) { int divisor = evnt.Date.Minute == 0 ? 1 : 60 / evnt.Date.Minute; Color clr = Color.FromArgb(175, evnt.EventColor.R, evnt.EventColor.G, evnt.EventColor.B); g.FillRectangle(new SolidBrush(GetFinalBackColor()), xStart, yStart + cellHourHeight / divisor + 1, ClientSize.Width - MarginSize * 2 - cellHourWidth - 3, cellHourHeight * ts.Hours - 1); g.FillRectangle(new SolidBrush(clr), xStart, yStart + cellHourHeight / divisor + 1, ClientSize.Width - MarginSize * 2 - cellHourWidth - 3, cellHourHeight * ts.Hours - 1); g.DrawString(evnt.startTime, evnt.EventFont, new SolidBrush(evnt.EventTextColor), xStart, yStart + cellHourHeight / divisor); g.DrawString(evnt.endTime, evnt.EventFont, new SolidBrush(evnt.EventTextColor), xStart, (yStart * 2) + cellHourHeight / divisor); g.DrawString(evnt.etc, evnt.EventFont, new SolidBrush(evnt.EventTextColor), xStart, (yStart * 3) + cellHourHeight / divisor); var ces = new cEvent { Event = evnt, Date = dt, EventArea = new Rectangle(xStart, yStart + cellHourHeight / divisor + 1, ClientSize.Width - MarginSize * 2 - cellHourWidth - 3, cellHourHeight * ts.Hours) }; _cEvents.Add(ces); } } yStart += cellHourHeight; } g.Dispose(); return bmp; }
/// <summary> /// 생성자 /// </summary> public Calendar() { InitializeComponent(); _calendarDate = DateTime.Now; _dayOfWeekFont = new Font("Arial", 10, FontStyle.Regular); _daysFont = new Font("Arial", 10, FontStyle.Regular); _todayFont = new Font("Arial", 10, FontStyle.Bold); _dateHeaderFont = new Font("Arial", 12, FontStyle.Bold); _dayViewTimeFont = new Font("Arial", 10, FontStyle.Bold); _showArrowControls = true; _showDateInHeader = true; _showTodayButton = true; _showingToolTip = false; _cEvent = new cEvent(); _showDisabledEvents = false; _showDashedBorderOnDisabledEvents = true; _dimDisabledEvents = true; AllowEditingEvents = true; _highlightCurrentDay = true; _calendarView = CalendarViews.Month; _scrollPanel = new ScrollPanel(); _events = new List<IEvent>(); _rectangles = new List<Rectangle>(); _calendarDays = new Dictionary<int, Point>(); _cEvents = new List<cEvent>(); _showEventTooltips = true; //_eventTip = new EventToolTip { Visible = false }; dateBoxes = new List<DateBox>(); //Controls.Add(_eventTip); LoadPresetHolidays = true; _scrollPanel.Visible = false; Controls.Add(_scrollPanel); }
// 해당 달의 캘린더를 그림 private void RenderMonthCalendar(PaintEventArgs e) { _calendarDays.Clear(); _cEvents.Clear(); dateBoxes.Clear(); // e.Graphics.draw var bmp = new Bitmap(ClientSize.Width, ClientSize.Height); Graphics g = Graphics.FromImage(bmp); e.Graphics.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAliasGridFit; g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAliasGridFit; SizeF sunSize = g.MeasureString("Sun", _dayOfWeekFont); SizeF monSize = g.MeasureString("Mon", _dayOfWeekFont); SizeF tueSize = g.MeasureString("Tue", _dayOfWeekFont); SizeF wedSize = g.MeasureString("Wed", _dayOfWeekFont); SizeF thuSize = g.MeasureString("Thu", _dayOfWeekFont); SizeF friSize = g.MeasureString("Fri", _dayOfWeekFont); SizeF satSize = g.MeasureString("Sat", _dayOfWeekFont); SizeF dateHeaderSize = g.MeasureString( _calendarDate.ToString("MMMM") + " " + _calendarDate.Year.ToString(CultureInfo.InvariantCulture), _dateHeaderFont); int headerSpacing = Max(sunSize.Height, monSize.Height, tueSize.Height, wedSize.Height, thuSize.Height, friSize.Height, satSize.Height) + 5; int controlsSpacing = ((!_showTodayButton) && (!_showDateInHeader) && (!_showArrowControls)) ? 0 : 30; int cellWidth = (ClientSize.Width - MarginSize * 2) / 7; int numWeeks = NumberOfWeeks(_calendarDate.Year, _calendarDate.Month); int cellHeight = (ClientSize.Height - MarginSize * 2 - headerSpacing - controlsSpacing) / numWeeks; int xStart = MarginSize; int yStart = MarginSize; DayOfWeek startWeekEnum = new DateTime(_calendarDate.Year, _calendarDate.Month, 1).DayOfWeek; int startWeek = ((int)startWeekEnum) + 1; int rogueDays = startWeek - 1; yStart += headerSpacing + controlsSpacing; int counter = 1; int counter2 = 1; bool first = false; bool first2 = false; _todayBtn.Location = new Point(MarginSize, MarginSize); // 달력 그리는 부분 for (int y = 0; y < numWeeks; y++) { for (int x = 0; x < 7; x++) { if (rogueDays == 0 && counter <= DateTime.DaysInMonth(_calendarDate.Year, _calendarDate.Month)) { if (!_calendarDays.ContainsKey(counter)) _calendarDays.Add(counter, new Point(xStart, (int)(yStart + 2f + g.MeasureString(counter.ToString(CultureInfo.InvariantCulture), _daysFont).Height))); // Today if (_calendarDate.Year == DateTime.Now.Year && _calendarDate.Month == DateTime.Now.Month && counter == DateTime.Now.Day && _highlightCurrentDay) { g.FillRectangle(new SolidBrush(Color.FromArgb(234, 234, 234)), xStart, yStart, cellWidth, cellHeight); } if(counter == selectedDay) { g.FillRectangle(new SolidBrush(Color.AliceBlue), xStart, yStart, cellWidth, cellHeight); } // Date 이벤트 부여를 위한 날짜 + Rectangle 구조 저장 DateBox dateInfo = new DateBox(); dateInfo.month = _calendarDate.Month; dateInfo.date = counter; dateInfo.size = new Rectangle(xStart, yStart, cellWidth, cellHeight); dateBoxes.Add(dateInfo); // 날짜 그리기 if (first == false) { first = true; if (_calendarDate.Year == DateTime.Now.Year && _calendarDate.Month == DateTime.Now.Month && counter == DateTime.Now.Day) { g.DrawString(counter.ToString(CultureInfo.InvariantCulture), _todayFont, Brushes.Black, xStart + 5, yStart + 2); } else { g.DrawString(counter.ToString(CultureInfo.InvariantCulture), _daysFont, Brushes.Black, xStart + 5, yStart + 2); } } else { if (_calendarDate.Year == DateTime.Now.Year && _calendarDate.Month == DateTime.Now.Month && counter == DateTime.Now.Day) { g.DrawString(counter.ToString(CultureInfo.InvariantCulture), _todayFont, Brushes.Black, xStart + 5, yStart + 2); } else { g.DrawString(counter.ToString(CultureInfo.InvariantCulture), _daysFont, Brushes.Black, xStart + 5, yStart + 2); } } counter++; } else if (rogueDays > 0) { int dm = DateTime.DaysInMonth(_calendarDate.AddMonths(-1).Year, _calendarDate.AddMonths(-1).Month) - rogueDays + 1; g.DrawString(dm.ToString(CultureInfo.InvariantCulture), _daysFont, new SolidBrush(Color.FromArgb(170, 170, 170)), xStart + 5, yStart + 2); rogueDays--; } // 달력 선 그리기 g.DrawRectangle(Pens.DarkGray, xStart, yStart, cellWidth, cellHeight); if (rogueDays == 0 && counter > DateTime.DaysInMonth(_calendarDate.Year, _calendarDate.Month)) { if (first2 == false) first2 = true; else { if (counter2 == 1) { g.DrawString(_calendarDate.AddMonths(1).ToString("MMM") + " " + counter2.ToString(CultureInfo.InvariantCulture), _daysFont, new SolidBrush(Color.FromArgb(170, 170, 170)), xStart + 5, yStart + 2); } else { g.DrawString(counter2.ToString(CultureInfo.InvariantCulture), _daysFont, new SolidBrush(Color.FromArgb(170, 170, 170)), xStart + 5, yStart + 2); } counter2++; counter++; } } xStart += cellWidth; } xStart = MarginSize; yStart += cellHeight; } xStart = MarginSize + ((cellWidth - (int)sunSize.Width) / 2); yStart = MarginSize + controlsSpacing; g.DrawString("Sun", _dayOfWeekFont, Brushes.Red, xStart, yStart); xStart = MarginSize + ((cellWidth - (int)monSize.Width) / 2) + cellWidth; g.DrawString("Mon", _dayOfWeekFont, Brushes.Black, xStart, yStart); xStart = MarginSize + ((cellWidth - (int)tueSize.Width) / 2) + cellWidth * 2; g.DrawString("Tue", _dayOfWeekFont, Brushes.Black, xStart, yStart); xStart = MarginSize + ((cellWidth - (int)wedSize.Width) / 2) + cellWidth * 3; g.DrawString("Wed", _dayOfWeekFont, Brushes.Black, xStart, yStart); xStart = MarginSize + ((cellWidth - (int)thuSize.Width) / 2) + cellWidth * 4; g.DrawString("Thu", _dayOfWeekFont, Brushes.Black, xStart, yStart); xStart = MarginSize + ((cellWidth - (int)friSize.Width) / 2) + cellWidth * 5; g.DrawString("Fri", _dayOfWeekFont, Brushes.Black, xStart, yStart); xStart = MarginSize + ((cellWidth - (int)satSize.Width) / 2) + cellWidth * 6; g.DrawString("Sat", _dayOfWeekFont, Brushes.Red, xStart, yStart); // 년도 쓰는 부분 if (_showDateInHeader) { g.DrawString( _calendarDate.Year.ToString(CultureInfo.InvariantCulture) + "년 " + _calendarDate.ToString("MMMM"), _dateHeaderFont, Brushes.Black, ClientSize.Width / 2, MarginSize); // 범례 부분 Font ImageInfoFont = new Font("Arial", 8, FontStyle.Regular); g.DrawRectangle(Pens.Black, new Rectangle(ClientSize.Width - 105, MarginSize - 16, 80, 46)); Bitmap start = new Bitmap(Application.StartupPath + @"\image\start.png"); Rectangle startSize = new Rectangle(ClientSize.Width - 100, MarginSize - 12, 10, 12); g.DrawImage(start, startSize); g.DrawString("근무 시작", ImageInfoFont, Brushes.Black, ClientSize.Width - 100 + 12, MarginSize - 12); Bitmap end = new Bitmap(Application.StartupPath + @"\image\end.png"); Rectangle endSize = new Rectangle(ClientSize.Width - 100, MarginSize + 2, 10, 12); g.DrawImage(end, endSize); g.DrawString("근무 종료", ImageInfoFont, Brushes.Black, ClientSize.Width - 100 + 12, MarginSize + 2); Bitmap etc = new Bitmap(Application.StartupPath + @"\image\etc.png"); Rectangle etcSize = new Rectangle(ClientSize.Width - 100, MarginSize + 16, 10, 12); g.DrawImage(etc, etcSize); g.DrawString("비고", ImageInfoFont, Brushes.Black, ClientSize.Width - 100 + 12, MarginSize + 16); } // 해당 년과 달의 이벤트를 찾아서 그리는 부분 for (int i = 1; i <= DateTime.DaysInMonth(_calendarDate.Year, _calendarDate.Month); i++) { int renderOffsetY = 0; foreach (IEvent v in _events) { var dt = new DateTime(_calendarDate.Year, _calendarDate.Month, i, 23, 59, _calendarDate.Second); // 해당 Date에 이벤트가 존재하면 if (NeedsRendering(v, dt)) { int alpha = 255; if (!v.Enabled && _dimDisabledEvents) alpha = 64; Color alphaColor = Color.FromArgb(alpha, v.EventColor.R, v.EventColor.G, v.EventColor.B); int offsetY = renderOffsetY; Region r = g.Clip; Point point = _calendarDays[i]; SizeF sz = g.MeasureString(v.startTime, v.EventFont); int yy = point.Y - 1; int xx = ((cellWidth - (int)sz.Width) / 2) + point.X; if (sz.Width > cellWidth) xx = point.X; if (renderOffsetY + sz.Height > cellHeight - 10) continue; g.Clip = new Region(new Rectangle(point.X + 1, point.Y + offsetY, cellWidth - 1, (int)(sz.Height * 4))); //g.FillRectangle(new SolidBrush(alphaColor), point.X + 1, point.Y + offsetY, cellWidth - 1, sz.Height); if (!v.Enabled && _showDashedBorderOnDisabledEvents) { var p = new Pen(new SolidBrush(Color.FromArgb(255, 0, 0, 0))) { DashStyle = DashStyle.Dash }; g.DrawRectangle(p, point.X + 1, point.Y + offsetY, cellWidth - 2, sz.Height - 1); } // 근무 시작 이미지와 글씨 입력 Bitmap start = new Bitmap(Application.StartupPath + @"\image\start.png"); Rectangle startSize = new Rectangle(xx, yy + offsetY, 10, (int)(sz.Height + 1)); g.DrawImage(start, startSize); g.DrawString(v.startTime, v.EventFont, new SolidBrush(v.EventTextColor), xx + 10, yy + offsetY); // 근무 마침 이미지와 글씨 입력 Bitmap end = new Bitmap(Application.StartupPath + @"\image\end.png"); Rectangle endSize = new Rectangle(xx, yy + (int)(sz.Height + 1), 10, (int)(sz.Height + 1)); g.DrawImage(end, endSize); g.DrawString(v.endTime, v.EventFont, new SolidBrush(v.EventTextColor), xx + 10, yy + (int)(sz.Height + 1)); // 비고란 이미지와 글씨 입력 Bitmap etc = new Bitmap(Application.StartupPath + @"\image\etc.png"); Rectangle etcSize = new Rectangle(xx, yy + (int)((sz.Height + 1) * 2), 10, (int)(sz.Height + 1)); g.DrawImage(etc, etcSize); g.DrawString(v.etc, v.EventFont, new SolidBrush(v.EventTextColor), xx + 10, yy + (int)((sz.Height + 1) * 2)); g.Clip = r; var evs = new cEvent { EventArea = new Rectangle(point.X + 1, point.Y + offsetY, cellWidth - 1, (int)sz.Height), Event = v, Date = dt }; _cEvents.Add(evs); renderOffsetY += (int)sz.Height + 1; } } } _rectangles.Clear(); g.Dispose(); e.Graphics.DrawImage(bmp, 0, 0, ClientSize.Width, ClientSize.Height); bmp.Dispose(); }