【问题标题】:ASP.Net codebehind can't access component from page?ASP.Net 代码隐藏无法从页面访问组件?
【发布时间】:2009-05-14 14:46:52
【问题描述】:

由于未知原因,我有 1 个页面无法通过 ID 访问任何组件。

这里有一些信息。该页面使用 asp:Content,因为该网站使用 MasterPage。在 asp:Content 中,此页面有一个 asp:FormView,其中包含一些我无法从 CodeBehind 访问的数据。

这是页面声明:

这是后面页面中无法编译的代码:

protected void FormView1_PreRender(object sender, EventArgs e)
{
    DateBirthdayValidator.MaximumValue = DateTime.Now.Date.ToString("dd-MM-yy");
}

这是错误:

错误 2 当前上下文中不存在名称“DateBirthdayValidator”

我在谷歌上搜索过,我得到了一些关于使用 FindControl 的答案,但它不起作用。有什么想法吗?

编辑1:

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

编辑2:

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

【问题讨论】:

  • 使用相同母版页的其他页面可以正常工作吗?
  • 是的,但他们没有 FormView... 但是是的,我可以从其他页面访问其他组件。这个页面有问题:S

标签: c# asp.net


【解决方案1】:
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] 的帖子。

【讨论】:

    【解决方案2】:

    问题是您在表单视图中声明的验证器在页面级别并不真正存在。这是您为FormView 定义的模板。父控件可以实例化一个模板(零次、一次或多次,例如考虑GridView 中的每一行;因此,创建它的控件)。您应该尝试像这样访问它:

    // Replace RangeValidator with the actual validator type, if different.
    var v = (RangeValidator)myFormView.Row.FindControl("DateBirthdayValidator");
    v.MaximumValue = ...;
    

    请注意,为了能够做到这一点,您的表单视图应该处于您声明验证器的模式(您可以使用 CurrentMode 属性检查)并且您应该已经调用 DataBind 将其绑定到一个数据源(以便至少存在单行,从而创建模板的一个实例)。

    【讨论】:

    • 好的,但我无法以任何方法访问组件(不仅是_PreRender)。
    • @Daok:如果我说的问题是问题,它不应该以任何方法起作用。这是编译时的事情。在编译时,基类没有这样的字段
    【解决方案3】:

    您在 aspx 页面中声明了 DateBirthdayValidator 吗?还要检查以确保 Visual Studio 在您的页面的设计器文件中创建相应的 DateBirthdayValidator 声明。听起来很可能设计器文件缺少控件的声明。

    【讨论】:

    • ASPX 在 FormView 的 EditItemTemplate 中有一个 DateBirhtdayValidator。对了,我可以在代码隐藏中访问FormView!?
    猜你喜欢
    • 2020-01-17
    • 1970-01-01
    • 1970-01-01
    • 2012-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多