由于未知原因,我有1页无法通过ID访问任何组件。
这是一些信息。页面使用asp:Content因为网站使用MasterPage。在asp:Content中,这个页面有一个asp:FormView,其中包含一些我无法从CodeBehind访问的数据。
这是Page声明:
以下是无法编译的页面中的代码:
protected void FormView1_PreRender(object sender, EventArgs e)
{
DateBirthdayValidator.MaximumValue = DateTime.Now.Date.ToString("dd-MM-yy");
}
这是错误:
错误2当前上下文中不存在名称“DateBirthdayValidator”
我在谷歌搜索,我得到了一些关于使用FindControl的答案,但它不起作用。有什么想法吗?
我可以访问FormView1组件,但不能访问EditItemTemplate中的验证器。如何访问EditTemplate内的控件?
如果我尝试:FormView1.FindControl("DateBirthdayValidator")
它会编译但总是返回null。所以仍然无法工作,但至少我可以访问FormView1 ...
答案 0 :(得分:2)
protected void FormView1_PreRender(object sender, EventArgs e)
{
if(FormView1.CurrentMode == FormViewMode.Edit)
((RangeValidator)FormView1.FindControl("DateBirthdayValidator")).MaximumValue = DateTime.Now.Date.ToString("dd-MM-yy");
}
FormView在您处于所需模式之前没有创建控件。由于DateBirhdayValidator处于编辑模式,因此需要在CodeBehind中进行验证,以确保仅在状态处于编辑状态时才能找到控件。
我找到了解决方案here,请参阅Steven Cheng [MSFT]的帖子。
答案 1 :(得分:1)
问题是您在表单视图中声明的验证程序在页面级别并不存在。这是您为FormView
定义的模板。父控件可以实例化一个模板(零,一次或多次,例如考虑GridView
中的每一行;因此,创建其控件)。你应该尝试访问它:
// Replace RangeValidator with the actual validator type, if different.
var v = (RangeValidator)myFormView.Row.FindControl("DateBirthdayValidator");
v.MaximumValue = ...;
请注意,为了能够执行此操作,您的表单视图应该处于您声明验证者的模式中(您可以使用CurrentMode
属性进行检查)并且您应该已经调用DataBind
将它绑定到数据源(以便至少存在单行,从而创建模板的实例)。
答案 2 :(得分:0)
您是否在aspx页面中声明了DateBirthdayValidator
?还要检查以确保Visual Studio在页面的设计器文件中创建相应的DateBirthdayValidator
声明。听起来很可能设计师文件缺少控件的声明。