我创建了一个非常简单的日历用户控件,其中包含一个公共属性,用于定义要显示的月份/年份。我的日历控件放在另一个ascx控件(本质上是包装器控件)中,其中包括用于一次向前和向后切换日历控件的LinkButton控件。如果我在设计时在包装器控件中显式定义日历控件的SelectedDateTime属性,则日历控件将显示正确的月/年。但是,当我尝试在上一个和下一个LinkButton控件上使用Click事件在运行时设置属性值时,日历控件永远不会获取我尝试分配给它的新SelectedDateTime值。
当我在调试模式下运行代码时,LinkButton的Click事件总是最后发生 - 在日历控件的SelectedDateTime属性的值已经设置为default并呈现之后。我错过了什么?
日历控件放在包装器控件中,就像任何旧控件一样:
<wsba:CalendarBase ID="CalendarControl" runat="server" />
我创建了一个LinkButton控件来选择“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 ...
}
答案 0 :(得分:0)
我可能在这里遗漏了一些内容,但是如果您的Calendar User Control依赖公共属性来更改其输出。您应该在Page_Load事件之后的事件中呈现控件。这将确保在对其属性进行任何设置后进行渲染。
您可以/应该将Calendar控件代码从Page_Load移动到Page_PreRender事件。这样,它会在其他服务器事件触发并且属性发生更改后始终呈现。