Пользовательская ячейка таблицы при клике не срабатывает при программном добавлении ячейки - PullRequest
2 голосов
/ 21 ноября 2011

Я пытаюсь сделать пользовательский календарь пользовательским элементом управления в .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"));

   }
}

Кто-нибудь может увидеть, где я иду не так? Любая помощь будет оценена.

1 Ответ

0 голосов
/ 21 ноября 2011

Как выглядит вывод html для таблицы и ячейки таблицы клиента?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...