updatepanel中的下拉自动搜索永远不会进入SelectedIndexChanged事件后面的代码

时间:2012-07-13 13:46:44

标签: asp.net drop-down-menu webforms updatepanel partial-postback

这是一个难以解释的场景,所以我编写了一个简单的例子。

<asp:UpdatePanel runat="server" ID="upTest" ChildrenAsTriggers="true"
UpdateMode="Conditional">
  <ContentTemplate>
     <asp:DropDownList ID="ddlTest" runat="server" AutoPostBack="true"></asp:DropDownList>
     <br /><br /> 
     In page: <asp:TextBox runat="server" ID="txtTest" Columns="50" Text="OnLoad</asp:TextBox>
     <br />
     <br />
     <asp:Button runat="server" ID="btnTest" Text="Click it" />
  </ContentTemplate>
  <Triggers>
     <asp:AsyncPostBackTrigger ControlID="ddlTest" />
  </Triggers>
 </UpdatePanel>

代码隐藏

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    If Page.IsPostBack Then
        BindDropDown(Request.Form(ddlTest.UniqueID))
    Else
        BindDropDown(0)
    End If
End Sub

Public Sub BindDropDown(val As Integer)

    ddlTest.Items.Add(New ListItem("", 0))
    ddlTest.Items.Add(New ListItem("One", 1))
    ddlTest.Items.Add(New ListItem("Two", 2))
    ddlTest.Items.Add(New ListItem("Three", 3))
    ddlTest.Items.Add(New ListItem("Four", 4))
    ddlTest.SelectedValue = val

End Sub

Private Sub ddlTest_SelectedIndexChanged(sender As Object, e As System.EventArgs) Handles ddlTest.SelectedIndexChanged
    txtTest.Text = "Dropdown changed"
End Sub

Private Sub btnTest_Click(sender As Object, e As System.EventArgs) Handles btnTest.Click
    txtTest.Text = "Button clicked"
End Sub

另外需要注意的是,我的页面有EnableViewState =“false”和ClientIdMode =“Static”。

单击按钮时会发生部分回发,文本框的预期值为“按钮单击”

当我更改下拉列表时会发生部分回发,但是文本框没有“Dropdown changed”的预期值,因为ddlTest_SelectedIndexChanged中的代码永远不会被命中(该行代码上的断点位置也永远不会命中)

在我的项目的更大范围内,这是问题的关键,我无法确定为什么这个事件永远不会被击中(核心问题是当我加载动态用户控件时,控件中的数据被正确绑定,但在加载用户控件后覆盖了事后数据 - 覆盖发生在回发事件的某处。在我看来它与下拉列表的绑定以及它在页面循环中发生的位置有关,但我无法解决任何问题,也没有提出谷歌解决方案。

在Firebug中查看帖子时我注意到了一件奇怪的事情 - 下拉列表的EVENTTARGET值是下拉列表的UniqueId,但按钮点击的EVENTTARGET值为空。我的大脑在想这里有一些联系。

仅供参考 - 我想出了一个似乎可以解决问题的工作。我在下拉列表中将autopostback设置为false,并使用jQuery我在下拉列表中分配更改事件以触发按钮单击 - 这会导致回发并在代码中触发btn_click事件。

1 个答案:

答案 0 :(得分:0)

我通过将下拉填充移动到init事件然后让.NET从视图状态加载选定的值来解决初始问题

但是,在执行此操作时,现在每个回发都会触发selectedindex事件。