设置DateEdit默认日期为DateTime.Now不生效的解决方法
问题说明
给DateEdit日期选择器设置默认日期时,仅能通过控件查找的方式访问对应实例,按如下代码编写后,无法成功修改原始DateEdit控件的日期取值:
GridViewToolbarItem dateEditItem = toolbar.Items.FindByName("ASPxDateEditItem"); ASPxDateEdit dayDate = dateEditItem.FindControl("deDateFrom") as ASPxDateEdit; dayDate.Date = DateTime.Now;
失效原因
- 代码执行时机错误:工具栏内嵌的嵌套控件不会在页面初始化早期完成实例挂载,在页面
Init阶段及之前通过FindControl拿到的实例,要么是未接入页面控件树的临时对象,要么赋值后会被控件自身的视图状态加载逻辑覆盖。 - 属性使用错误:DevExpress的
ASPxDateEdit控件在工具栏模板场景下,仅给Date属性赋值不会同步控件的实际提交值,后续取值时会读取旧的Value属性值,表现为赋值不生效。
正确实现方法
- 把控件查找和赋值逻辑放到页面
Load事件,或者工具栏的ItemCreated事件中执行,不要在初始化阶段过早调用。 - 首次加载页面时(非回发状态)同时给
Value和Date属性赋值,避免回发时覆盖用户手动选择的日期,参考代码:
protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { GridViewToolbarItem dateEditItem = toolbar.Items.FindByName("ASPxDateEditItem"); ASPxDateEdit dayDate = dateEditItem.FindControl("deDateFrom") as ASPxDateEdit; if (dayDate != null) { DateTime targetDefaultDate = DateTime.Now; dayDate.Value = targetDefaultDate; dayDate.Date = targetDefaultDate; } } }
- 如果直接从工具栏项层级找不到控件,说明目标控件放在工具栏项的模板容器内,直接在工具栏的
ItemCreated事件里查找赋值即可:
protected void Grid_ToolbarItemCreated(object sender, GridViewToolbarItemEventArgs e) { if (e.Item.Name == "ASPxDateEditItem" && !IsPostBack) { ASPxDateEdit dayDate = e.Item.FindControl("deDateFrom") as ASPxDateEdit; if (dayDate != null) { dayDate.Value = DateTime.Now; } } }
注意:必须添加
!IsPostBack判断,否则每次页面回发都会重置日期为当前时间,用户手动选择的日期会被强制覆盖。
内容的提问来源于stack exchange,提问作者bags
相关产品推荐
相关产品推荐

