为何修改FormView控件的代码在DataBound事件正常,ItemUpdated事件却失效
问题原因分析
这是ASP.NET Web Forms的页面生命周期、FormView事件执行逻辑和模板切换机制共同导致的,具体分为两点:
- 事件执行顺序导致赋值被覆盖
FormView的ItemUpdating/ItemUpdated属于回发过程中的更新处理阶段事件,这两个事件触发后,FormView会自动执行数据重绑定逻辑,会用数据源的最新值(或者绑定字段的默认值)覆盖你手动修改的控件属性,所以你在事件里修改的Text值不会保留到最终渲染的页面上。
而DataBound事件是数据绑定完成、渲染页面前的最后一个相关事件,此时修改的控件值不会再被其他逻辑覆盖,因此可以正常生效。 - 模板切换导致控件不存在
FormView默认在更新操作完成后会自动从编辑模式(EditMode)切回只读模式(ReadOnlyMode),两个模式对应完全独立的模板:你要找的myField文本框只存在于编辑模板(EditItemTemplate)中,切换回只读模式后该控件已经被销毁,FindControl会返回空对象,你对Text的赋值自然不会生效。
解决方法
根据你的需求选择对应方案即可:
- 如果是要修改提交到数据源的更新值,不要修改控件属性,直接修改
ItemUpdating事件参数的NewValues字典:
Protected Sub FormView1_ItemUpdating(ByVal Sender As Object, ByVal e As FormViewUpdateEventArgs) Handles FormView1.ItemUpdating e.NewValues("myField") = "Some value" End Sub
- 如果是要更新完成后仍然在编辑界面显示自定义值,首先要设置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
- 如果是要更新完成后在只读界面显示自定义值,直接修改对应只读模板的控件,或者修改数据源对应字段的值再重绑定即可。
内容的提问来源于stack exchange,提问作者esims
相关产品推荐
相关产品推荐

