You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何修改FormView控件的代码在DataBound事件正常,ItemUpdated事件却失效

问题原因分析

这是ASP.NET Web Forms的页面生命周期、FormView事件执行逻辑和模板切换机制共同导致的,具体分为两点:

  • 事件执行顺序导致赋值被覆盖
    FormView的ItemUpdating/ItemUpdated属于回发过程中的更新处理阶段事件,这两个事件触发后,FormView会自动执行数据重绑定逻辑,会用数据源的最新值(或者绑定字段的默认值)覆盖你手动修改的控件属性,所以你在事件里修改的Text值不会保留到最终渲染的页面上。
    而DataBound事件是数据绑定完成、渲染页面前的最后一个相关事件,此时修改的控件值不会再被其他逻辑覆盖,因此可以正常生效。
  • 模板切换导致控件不存在
    FormView默认在更新操作完成后会自动从编辑模式(EditMode)切回只读模式(ReadOnlyMode),两个模式对应完全独立的模板:你要找的myField文本框只存在于编辑模板(EditItemTemplate)中,切换回只读模式后该控件已经被销毁,FindControl会返回空对象,你对Text的赋值自然不会生效。
解决方法

根据你的需求选择对应方案即可:

  1. 如果是要修改提交到数据源的更新值,不要修改控件属性,直接修改ItemUpdating事件参数的NewValues字典:
Protected Sub FormView1_ItemUpdating(ByVal Sender As Object, ByVal e As FormViewUpdateEventArgs) Handles FormView1.ItemUpdating
    e.NewValues("myField") = "Some value"
End Sub
  1. 如果是要更新完成后仍然在编辑界面显示自定义值,首先要设置FormView更新后不切换模式,再在DataBound事件中赋值:
Protected Sub FormView1_ItemUpdated(ByVal Sender As Object, ByVal e As FormViewUpdatedEventArgs) Handles FormView1.ItemUpdated
    ' 阻止FormView自动切回只读模式
    FormView1.KeepInEditMode = True
    ' 手动触发重绑定,让后续DataBound事件执行
    FormView1.DataBind()
End Sub

Protected Sub FormView1_DataBound(ByVal sender As Object, ByVal e As System.EventArgs) Handles FormView1.DataBound        
    If FormView1.CurrentMode = FormViewMode.Edit Then
        CType(FormView1.FindControl("myField"), TextBox).Text = "Some value"
    End If
End Sub
  1. 如果是要更新完成后在只读界面显示自定义值,直接修改对应只读模板的控件,或者修改数据源对应字段的值再重绑定即可。

内容的提问来源于stack exchange,提问作者esims

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 08:39:00