Обновить общедоступное свойство пользовательского элемента управления при нажатии кнопки ссылки

Я создал очень простой пользовательский элемент управления календарем, содержащий общедоступное свойство, которое используется для определения отображаемого месяца/года. Мой элемент управления календарем помещен внутри другого элемента управления ascx (по сути, элемента управления-оболочки), который включает элементы управления LinkButton, используемые для переключения элемента управления календарем вперед и назад на один месяц за раз. Если я явно определяю свойство SelectedDateTime элемента управления календарем в элементе управления-оболочке во время разработки, соответствующий месяц/год отображается элементом управления календарем. Однако, когда я пытаюсь установить значение свойства во время выполнения, используя событие Click для предыдущего и следующего элементов управления LinkButton, элемент управления календарем никогда не получает новое значение SelectedDateTime, которое я пытаюсь ему присвоить.

Когда я запускаю код в режиме отладки, событие Click LinkButton всегда происходит последним — после того, как значение свойства SelectedDateTime элемента управления календарем уже было установлено по умолчанию и отображено. Что мне не хватает?

Элемент управления календарем помещается в элемент управления-оболочку, как и любой старый элемент управления:

<wsba:CalendarBase ID="CalendarControl" runat="server" />

Я создал элемент управления LinkButton для выбора «Следующий месяц» и соответствующий ему обработчик событий Click, например:

    protected void NextMonthLink_Click(object sender, EventArgs e)
    {
        CalendarControl.SelectedDateTime = CalendarControl.SelectedDateTime.AddMonths(1);            
    }

Это мясо самого элемента управления календарем:

    public partial class CalendarBase : System.Web.UI.UserControl
{
    public DateTime SelectedDateTime { get; set; }
    public List<Item> SelectedCalendars { get; set; }

    public CalendarBase()
    {
        // default SelectedDateTime to Now if no value was set
        if (SelectedDateTime.Year.Equals(1)) { SelectedDateTime = DateTime.Now; }
    }

    protected void Page_Load(object sender, EventArgs e)
    {
        // grab the month and year from the selectedDateTime
        int selectedMonth = SelectedDateTime.Month;
        int selectedYear = SelectedDateTime.Year;
        ... Do the rest of the stuff to render my control ...
    }

person Paul    schedule 04.02.2011    source источник


Ответы (1)


Я, вероятно, что-то упускаю здесь, но если ваш пользовательский элемент управления календарем использует общедоступные свойства для изменения своего вывода. Вы должны визуализировать элемент управления в событии ПОСЛЕ события Page_Load. Это гарантирует, что рендеринг произойдет после любой настройки его свойств.

Вы можете/должны переместить код управления календарем из Page_Load в событие Page_PreRender. Таким образом, он всегда будет отображаться после запуска других событий сервера и изменения свойств.

страница жизненного цикла страницы MSDN

person davidsleeps    schedule 04.02.2011
comment
Хорошее предложение - спасибо! Я определенно думаю, что ты здесь что-то затеваешь. Я попробую и отпишусь о своих результатах. - person Paul; 04.02.2011
comment
Я переместил код рендеринга элемента управления календарем в Page_PreRender, который отлично работает, если вы один раз нажмете кнопку «Следующий месяц». Однако любые дальнейшие щелчки приводят к тому, что элемент управления календарем возвращается к значению свойства SelectedDateTime по умолчанию! Почему свойство элемента управления, которое было установлено ранее, не сохраняется между обратными передачами? - person Paul; 04.02.2011
comment
Ahhh - свойства пользовательских элементов управления, которые необходимо установить (т. е. поля, не предназначенные только для чтения), должны быть установлены через ViewState. Это имеет смысл и объясняет, почему значение устанавливалось только для одного клика. Пошаговое руководство. Создание повторно используемых элементов с помощью пользовательских элементов управления ASP.NET - person Paul; 04.02.2011