Я пытаюсь сделать пользовательский календарь пользовательским элементом управления в .Net v4. Для этого элемента управления я создал пользовательскую ячейку таблицы ASP, которая имеет событие onclick. Класс ниже:
public class ClickableTableCell : System.Web.UI.WebControls.TableCell, IPostBackEventHandler
{
private static readonly object TableCellClicked = new object();
public event EventHandler Click
{
add
{
base.Events.AddHandler(TableCellClicked, value);
}
remove
{
base.Events.RemoveHandler(TableCellClicked, value);
}
}
public override void RenderBeginTag(HtmlTextWriter writer)
{
string argument = null;
if (this.ID != null)
{
argument = this.ID.ToString().Replace("/", "-");
}
Attributes.Add("onclick", Page.ClientScript.GetPostBackEventReference(this, argument));
base.RenderBeginTag(writer);
}
public void RaisePostBackEvent(string eventArgument)
{
OnClick(new EventArgs());
}
protected void OnClick(EventArgs e)
{
EventHandler handler = (EventHandler)base.Events[TableCellClicked];
if (handler != null)
{
handler(this, e);
}
}
}
У меня в пользовательском элементе управления есть метод, который создает эту таблицу, используя мою собственную ячейку таблицы. Этот метод запускается при загрузке страницы пользовательского элемента управления, поэтому таблица всегда заполняется. Один и тот же идентификатор всегда присваивается ячейке таблицы, которую можно активировать, однако событие щелчка, которое я установил, никогда не запускается. Ну, он срабатывает, когда я объявляю кликабельную ячейку таблицы в файле ASCX, он не работает, если я добавляю его программно, поэтому я не думаю, что с классом ячеек таблицы что-то не так.
protected void DrawMonth(DateTime monthToDraw, CultureInfo calCulture)
{
try
{
tblCal.Rows.Clear();
System.Globalization.Calendar calToDraw = calCulture.Calendar;
DayOfWeek firstDayOfWeek = calCulture.DateTimeFormat.FirstDayOfWeek;
//Add in day headings
TableHeaderRow dayHeadings = new TableHeaderRow();
int dayToStartFrom = (int)firstDayOfWeek;
for (int iDay = 0; iDay < 7; iDay++)
{
TableHeaderCell dayCell = new TableHeaderCell();
dayCell.ID = "tcDayHeader" + iDay;
dayCell.Text = calCulture.DateTimeFormat.DayNames[dayToStartFrom];
dayCell.Width = new Unit(14.28, UnitType.Percentage);
dayHeadings.Cells.Add(dayCell);
dayToStartFrom++;
if (dayToStartFrom > 6)
{
dayToStartFrom = 0;
}
}
tblCal.Rows.Add(dayHeadings);
//Add in dates
int startOffset = (int)calToDraw.GetDayOfWeek(new DateTime(monthToDraw.Year, monthToDraw.Month, 1).AddDays(-1));
int endOffset = (int)calToDraw.GetDayOfWeek(new DateTime(monthToDraw.Year, monthToDraw.Month, calToDraw.GetDaysInMonth(monthToDraw.Year, monthToDraw.Month)));
if (endOffset > 0)
{
endOffset = 7 - (int)calToDraw.GetDayOfWeek(new DateTime(monthToDraw.Year, monthToDraw.Month, calToDraw.GetDaysInMonth(monthToDraw.Year, monthToDraw.Month)));
}
int dateOn = 1;
int numOfWeeks = Helpers.DateHelper.GetNumOfWeeksInMonth(monthToDraw, calToDraw);
DateTime cellDate;
for (int iNumWeek = 0; iNumWeek <= numOfWeeks - 1; iNumWeek++)
{
TableRow weekRow = new TableRow();
weekRow.ID = "rowWeek" + iNumWeek.ToString();
for (int iNumDayInWeek = 0; iNumDayInWeek <= 6; iNumDayInWeek++)
{
ClickableTableCell dayCell = new ClickableTableCell();
if (iNumWeek == 0)
{
if (iNumDayInWeek < startOffset)
{
dayCell.CssClass = "OutOfBounds";
}
else
{
dayCell.Text = dateOn.ToString();
dateOn++;
}
}
else if (iNumWeek == numOfWeeks - 1)
{
if (iNumDayInWeek > 6 - endOffset)
{
dayCell.CssClass = "OutOfBounds";
}
else
{
dayCell.Text = dateOn.ToString();
dateOn++;
}
}
else
{
dayCell.Text = dateOn.ToString();
dateOn++;
}
dayCell.Width = new Unit(14.28, UnitType.Percentage);
if (monthToDraw.Year == DateTime.Now.Year && monthToDraw.Month == DateTime.Now.Month && (dateOn - 1) == DateTime.Now.Day)
{
dayCell.CssClass = "Today";
}
// Get calendar data
if (dayCell.CssClass != "OutOfBounds")
{
cellDate = monthToDraw.AddDays((monthToDraw.Day * -1) - 1 + dateOn).Date;
dayCell.ID = cellDate.ToString().Replace(' ', '-');
}
// add click event to the TableCell
dayCell.Click += new EventHandler(this.DayClicked);
dayCell.Attributes.Add("onmouseover", "this.style.cursor='pointer'");
// add cell to collection
weekRow.Cells.Add(dayCell);
}
tblCal.Rows.Add(weekRow);
}
lblCurrentMonth.Text = calCulture.DateTimeFormat.MonthNames[monthToDraw.Month - 1] + " " + monthToDraw.Year.ToString();
tblCal.CssClass = "AppointCal";
}
catch (Exception _exception)
{
throw new Exception(_exception.ToString());
}
}
Интересно, что если я добавлю этот код в загрузку страницы, он перехватит щелчок.
if (Page.IsPostBack)
{
//It is a postback so check if it was by div click
string target = Request["__EVENTTARGET"];
if (target.Contains("ctl00$cphContent$amaAppointmentsCal$"))
{
//ClickableTableCell clickedCell = (ClickableTableCell)sender;
string id = Request["__EVENTARGUMENT"];
DrawDay(Convert.ToDateTime(id), new CultureInfo("en-GB"));
}
}
Кто-нибудь может увидеть, где я иду не так? Любая помощь будет оценена.