在linkbutton click上更新用户控件公共属性

时间:2011-02-04 00:03:16

标签: asp.net user-controls page-lifecycle event-handling

我创建了一个非常简单的日历用户控件,其中包含一个公共属性,用于定义要显示的月份/年份。我的日历控件放在另一个ascx控件(本质上是包装器控件)中,其中包括用于一次向前和向后切换日历控件的LinkBut​​ton控件。如果我在设计时在包装器控件中显式定义日历控件的SelectedDateTime属性,则日历控件将显示正确的月/年。但是,当我尝试在上一个和下一个LinkBut​​ton控件上使用Click事件在运行时设置属性值时,日历控件永远不会获取我尝试分配给它的新SelectedDateTime值。

当我在调试模式下运行代码时,LinkBut​​ton的Click事件总是最后发生 - 在日历控件的SelectedDateTime属性的值已经设置为default并呈现之后。我错过了什么?

日历控件放在包装器控件中,就像任何旧控件一样:

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

我创建了一个LinkBut​​ton控件来选择“Next Month”及其相应的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 ...
    }

1 个答案:

答案 0 :(得分:0)

我可能在这里遗漏了一些内容,但是如果您的Calendar User Control依赖公共属性来更改其输出。您应该在Page_Load事件之后的事件中呈现控件。这将确保在对其属性进行任何设置后进行渲染。

您可以/应该将Calendar控件代码从Page_Load移动到Page_PreRender事件。这样,它会在其他服务器事件触发并且属性发生更改后始终呈现。

MSDN Page Lifecycle page