【问题标题】:FindControl looks for controls in incorrect template of FormViewFindControl 在 FormView 的错误模板中查找控件
【发布时间】:2013-09-22 01:41:26
【问题描述】:

在 FormView 中切换模式时如何从代码隐藏中定位控件? 看起来您不能在 Page_Load 事件期间使用 FindControl,因为它将在先前显示的模板中搜索控件,而不是新选择的模板。 我怀疑您不能单独依赖 PageLoad,而必须在另一个事件中找到控件,例如 OnDataBound,但是您真的必须这样做吗? 我在一天中看到了几个缺少诸如 OnDataBound 之类的事件的表单视图...

关于我的具体案例的更多详细信息: 我有一个表单视图,其中 ItemTemplate、InsertItemTemplate 和 EditItemTemplate 都包含相同的文本框。 (它在所有模板中都有相同的 ID)

在 Page_Load 事件期间,我使用 FindControl 来定位文本框并更改其可见性。 最初加载表单视图时工作正常,但由于某种原因,当表单更改模式/更改模板时它不起作用(在页面呈现后,您会看到文本框可见性不正确)

例如从读取模式切换到编辑模式 - formview.Mode 将设置为 FormViewMode.Edit,但是当在 PageLoad 事件期间使用 FindControl 时,它将在 ItemTemplate 而不是 EditItemTemplate 中搜索控件。 因此,如果您在所有模板中都有一个具有相同 ID 的控件,它将在不正确的模板中找到该控件,并且在页面加载后,您会非常困惑为什么加载的控件没有相同的属性正如您在 pageLoad 期间在调试器中检查它时所想的那样。

【问题讨论】:

    标签: asp.net formview findcontrol


    【解决方案1】:

    不要使用Page_Load 绑定或访问您的FormView,而是使用FormViewDataBound 事件和CurrentMode property

    protected void FormView1_DataBound(object sender, System.EventArgs e)
    {
        if(FormView1.CurrentMode == FormViewMode.ReadOnly)
        {
            // here you can safely access the FormView's ItemTemplate and it's controls via FindControl
        }
        else if(FormView1.CurrentMode == FormViewMode.Edit)
        {
            // here  you can safely access the FormView's EditItemTemplate and it's controls via FindControl
        }
        else if(FormView1.CurrentMode == FormViewMode.Insert)
        {
            // here you can safely access the FormView's InsertItemTemplate and it's controls via FindControl
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2010-12-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多