아래 코드의 생각은 Page_Load 메서드에 필요한 모든 컨트롤을 만들고 appr 불투명 용기.
<asp:Calendar runat="server" ID="Calendar1" Width="800px" Height="700px" BackColor="White"
BorderColor="Black" DayNameFormat="Shortest" Font-Names="Times New Roman" Font-Size="10pt"
ForeColor="Black" NextPrevFormat="FullMonth" TitleFormat="Month" ShowGridLines="true" >
<DayHeaderStyle BackColor="#CCCCCC" Font-Bold="True" Font-Size="7pt" ForeColor="#333333"
Height="10pt" />
<DayStyle Width="14%" />
<NextPrevStyle Font-Size="8pt" ForeColor="White" />
<OtherMonthDayStyle ForeColor="#999999" />
<SelectedDayStyle BackColor="#CC3333" ForeColor="White" />
<SelectorStyle BackColor="#CCCCCC" Font-Bold="True" Font-Names="Verdana" Font-Size="8pt"
ForeColor="#333333" Width="1%" />
<TitleStyle BackColor="Black" Font-Bold="True" Font-Size="13pt" ForeColor="White"
Height="14pt" />
<TodayDayStyle BackColor="#CCCC99" />
</asp:Calendar>
<asp:PlaceHolder runat="server" ID="PlaceHolder1"></asp:PlaceHolder>
숨김 코드 :
private Dictionary<DateTime, List<Control>> DayControls = new Dictionary<DateTime, List<Control>>();
protected void Page_Init(object sender, EventArgs e)
{
Calendar1.DayRender += new DayRenderEventHandler(Calendar1_DayRender);
}
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
if(Calendar1.VisibleDate == DateTime.MinValue)
{
Calendar1.VisibleDate = DateTime.Today;
}
}
FillDayControls(Calendar1.VisibleDate);
}
void Calendar1_DayRender(object sender, DayRenderEventArgs e)
{
if (!DayControls.ContainsKey(e.Day.Date)) return;
foreach (var control in DayControls[e.Day.Date])
{
control.Parent.Controls.Remove(control);
e.Cell.Controls.Add(control);
if (control is Button)
{
ClientScript.RegisterForEventValidation(control.UniqueID);
}
}
}
private void FillDayControls(DateTime dateTime)
{
var firstMonthDate = new DateTime(dateTime.Year, dateTime.Month, 1);
var calendarFirstWeekDay = Calendar1.FirstDayOfWeek == FirstDayOfWeek.Default
? CultureInfo.CurrentCulture.DateTimeFormat.FirstDayOfWeek
: (DayOfWeek) (int) Calendar1.FirstDayOfWeek;
var currentDate = firstMonthDate.DayOfWeek == calendarFirstWeekDay ? firstMonthDate.AddDays(-7) : firstMonthDate.AddDays((int)firstMonthDate.DayOfWeek * -1);
var lastDate = currentDate.AddDays(41);
do
{
var events = GetCalendarEvents(currentDate);
if (events.Count > 0)
{
DayControls.Add(currentDate, new List<Control>());
}
foreach (var calendarEvent in events)
{
var lbl = new Label
{
BorderColor = System.Drawing.Color.Black,
BorderStyle = BorderStyle.Double,
BackColor = System.Drawing.Color.BlanchedAlmond,
Text = string.Format("{0}<br />{1:hh:mm:ss tt} -- {2:hh:mm:ss tt}", calendarEvent.Title, calendarEvent.Start, calendarEvent.End)
};
DayControls[currentDate].Add(lbl);
PlaceHolder1.Controls.Add(lbl);
var btn = new Button
{
Text = "x",
ID = "DeleteEvent_" + calendarEvent.Id,
CommandName = "DeleteEvent",
CommandArgument = calendarEvent.Id
};
DayControls[currentDate].Add(btn);
PlaceHolder1.Controls.Add(btn);
btn.Click += new EventHandler(btn_Click);
}
currentDate = currentDate.AddDays(1);
} while (currentDate <= lastDate);
}
private void btn_Click(object sender, EventArgs e)
{
var eventId = ((Button)sender).CommandArgument;
}
private List<CalendarEvent> GetCalendarEvents(DateTime dateTime)
{
return new List<CalendarEvent>{
new CalendarEvent
{
Id = string.Format("{0:MMMddyyyy}Event" ,dateTime),
Start = dateTime.Date.AddHours(10),
End = dateTime.Date.AddHours(12),
Title = string.Format("{0:dd/MM} meeting", dateTime)
}};
}
CalendarEvent 클래스 스텁 :
public class CalendarEvent
{
public string Id { get; set; }
public DateTime Start { get; set; }
public DateTime End { get; set; }
public string Title { get; set; }
}
, 미래에 코드를 포맷하는 데 시간이 걸릴하시기 바랍니다. 질문 텍스트 바로 아래에 미리보기가 있습니다. 독자가 질문을 쉽게 따르도록하는 작은 변화입니다. – Patrick
'e'가 무엇인지 알려주시겠습니까? 아마도 'ASP : 테이블'일까요? – Patrick
괜찮아요. 다음에 신경 써서 죄송합니다. – vini