ASP.Net codebehind无法从页面访问组件?

时间:2009-05-14 14:46:52

标签: c# asp.net

由于未知原因,我有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的答案,但它不起作用。有什么想法吗?

EDIT1:

我可以访问FormView1组件,但不能访问EditItemTemplate中的验证器。如何访问EditTemplate内的控件?

EDIT2:

如果我尝试:FormView1.FindControl("DateBirthdayValidator")它会编译但总是返回null。所以仍然无法工作,但至少我可以访问FormView1 ...

3 个答案:

答案 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声明。听起来很可能设计师文件缺少控件的声明。