PRB: ASP.NET 引发的 Change 事件时也不会更改控件值

文章翻译 文章翻译
文章编号: 314809 - 查看本文应用于的产品
展开全部 | 关闭全部

本文内容

症状

在特殊的情况下,ASP.NET 激发更改事件的 ASP.NET 网页的控制,即使您没有更改该控件。

原因

SelectedIndexChanged 事件 DropDownList 控件中的或 TextChanged 事件,在一个 文本框 控件中的某些控件依赖于使用视图状态更改事件的注册。当您这些动态创建控件后该事件已挂钩,您会遇到此问题。

当 ASP.NET 呈现到浏览器页面时,动态创建的控件不具有相关联的更改事件。存在没有事件是 ASP.NET 不会保存视图状态。这称为视图状态优化。

当页发回,和事件挂钩时,ASP.NET 需要视图状态,但查找表明不存在。这种差异触发,Change 事件,即使尚未更改该控件。

解决方案

请确保您挂接 Change 事件动态创建的控件,ASP.NET 将呈现页之前。这可以确保该控件的视图状态验证存在。

状态

此行为是设计使然。

更多信息

重现行为的步骤

创建 Web 窗体

  1. 创建新的 Visual Basic ASP.NET 应用程序名为 ChangeFired。
  2. 在设计器的模式下打开 WebForm1。将 DataList 控件、 一个 按钮 控件和 数据集 的控件拖到窗体上。
  3. 添加数据集 对话框中单击 非类型化数据集,然后单击 确定。保留默认名称的所有控件。
  4. 编辑为 DataSet1 Tables 集合。添加一个名为表 1 的新表。
  5. 编辑 Table1 列集合。添加名为 Column1 为新列。
  6. 单击 DataList1,然后将 数据源 属性更改为 DataSet1
  7. 用鼠标右键单击 DataList1,指向 编辑模板,然后再单击 项模板。将 DropDownList 控件拖动到 ItemTemplate 部分。
  8. 单击 DropDownList1,然后添加到项集合中的五个项目。文本 和这些项目的 Value 属性分别设置为 一个两个四个,和 五个
  9. 为 DropDownList1,AutoPostBack 属性设置为 true
  10. 编辑 DropDownList1 在数据绑定集合。下面的自定义绑定表达式会将添加到 SelectedIndex 属性:
    DataBinder.Eval(Container, "DataItem.Column1")
    					
  11. 切换到 HTML 视图。在 跟踪 属性设置为 true@ Page 指令中,如下所示:
    <%@ Page Language="vb" AutoEventWireup="false" Codebehind="WebForm1.aspx.vb" 
    Inherits="ChangeFired.WebForm1" trace="true" %>
    					

添加代码隐藏文件

  1. 用鼠标右键单击 WebForm1.aspx,然后单击 查看代码
  2. 添加到 Page_Load 事件下面的代码:
    DataSet1.Tables(0).Rows.Add(New Object() {"1"})
    DataSet1.Tables(0).Rows.Add(New Object() {"2"})
    DataSet1.Tables(0).Rows.Add(New Object() {"3"})
    DataSet1.Tables(0).Rows.Add(New Object() {"4"})
    
    If Not IsPostBack Then
      DataBind()
    End If
    
    Dim objItem As DataListItem
    For Each objItem In DataList1.Items
      AddHandler CType(objItem.FindControl("DropDownList1"), _
      DropDownList).SelectedIndexChanged, AddressOf DropDownList1_SelectedIndexChanged
      If Not objItem.FindControl("DropDownList1") Is Nothing Then
        Trace.Write("Added SelectedIndexChanged Handler")
      End If
    Next
    					
  3. 创建一个新的 Sub 过程下面 Page_Load 事件处理 SelectedIndexChanged 事件,如下所示:
    Private Sub DropDownList1_SelectedIndexChanged(ByVal sender As System.Object, _
    ByVal e As System.EventArgs)
      DataBind()
      Trace.Write("SelectedIndexChanged, DataBind()")
    
      'Uncomment the following code to resolve this problem.
      'Dim objItem As DataListItem
      'For Each objItem In DataList1.Items
      '  AddHandler CType(objItem.FindControl("DropDownList1"), _
      '  DropDownList).SelectedIndexChanged, AddressOf DropDownList1_SelectedIndexChanged
      'Next
    End Sub
    					

运行示例

  1. 运行该页。请注意动态创建的 DropDownList 控件包含跟踪信息用于在控制树中的视图状态。

    因为调用 DataBind 方法动态创建 DropDownList 控件,并与您在事件处理程序挂钩 Page_Load 事件中调用 DataBind 后,将发生这种情况。因为该控件的事件处理视图状态,所以优化不会发生。
  2. 单击页面上的按钮。请注意将出现张贴内容后,并且只在 Page_Load 事件代码运行。因为事件处理程序是与控件相关联,视图状态存在 DropDownList 的各个控件。
  3. 更改在其中一个 DropDownList 控件值。请注意张贴内容后发生。此外,请注意 ASP.NET 将触发 Page_Load 事件,并且运行 DropDownList1_SelectedIndexChanged 事件。
  4. DropDownList1_SelectedIndexChanged 事件中都调用 DataBind 方法再次以创建新 DropDownList 控件。

    由于 SelectedIndexChanged 事件未挂钩到这些新 DropDownList 控件,ASP.NET 使用视图状态优化,并且不保存新 DropDownList 控件的视图状态。
  5. 查看跟踪信息的控件树。请注意 DropDownList 控件没有的视图状态。
  6. 单击页面上的按钮。请注意将发生,投递回,并注意 ASP.NET 运行 Page_Load 事件。挂钩到 DropDownList 控件 SelectedIndexChanged 事件,因为 ASP.NET 将需要与控件相关联的视图状态。

    但是,因为不存在视图状态,ASP.NET 触发 SelectedIndexChanged 事件,即使您没有选择项目。

分辨率

若要解决此问题,取消 DropDownList1_SelectedIndexChanged 事件中的代码注释,以便将事件处理程序挂钩与新创建的控件。

属性

文章编号: 314809 - 最后修改: 2004年5月3日 - 修订: 2.7
这篇文章中的信息适用于:
  • Microsoft ASP.NET 1.1
  • Microsoft ASP.NET 1.0
关键字:?
kbmt kbdatabinding kbevent kbprb kbservercontrols kbstate kbwebforms KB314809 KbMtzh
机器翻译
注意:这篇文章是由无人工介入的微软自动的机器翻译软件翻译完成。微软很高兴能同时提供给您由人工翻译的和由机器翻译的文章, 以使您能使用您的语言访问所有的知识库文章。然而由机器翻译的文章并不总是完美的。它可能存在词汇,语法或文法的问题,就像是一个外国人在说中文时总是可能犯这样的错误。虽然我们经常升级机器翻译软件以提高翻译质量,但是我们不保证机器翻译的正确度,也不对由于内容的误译或者客户对它的错误使用所引起的任何直接的, 或间接的可能的问题负责。
点击这里察看该文章的英文版: 314809
Microsoft和/或其各供应商对于为任何目的而在本服务器上发布的文件及有关图形所含信息的适用性,不作任何声明。 所有该等文件及有关图形均"依样"提供,而不带任何性质的保证。Microsoft和/或其各供应商特此声明,对所有与该等信息有关的保证和条件不负任何责任,该等保证和条件包括关于适销性、符合特定用途、所有权和非侵权的所有默示保证和条件。在任何情况下,在由于使用或运行本服务器上的信息所引起的或与该等使用或运行有关的诉讼中,Microsoft和/或其各供应商就因丧失使用、数据或利润所导致的任何特别的、间接的、衍生性的损害或任何因使用而丧失所导致的之损害、数据或利润不负任何责任。

提供反馈

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com