これは説明が難しいシーンなので、簡単な例をコーディングしました。
<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"があります。
ボタンをクリックすると、部分的なポストバックが発生し、テキストボックスの期待値は「ボタンがクリックされました」になります。
ドロップダウンを変更すると、部分的なポストバックが発生しますが、ddlTest_SelectedIndexChangedのコードがヒットしないため、テキストボックスに「ドロップダウンが変更されました」という期待値がありません(そのコード行のブレークポイントの配置もヒットしません)
私のプロジェクトのより広い範囲では、これが問題の核心であり、このイベントが発生しない理由を特定できません(コアの問題は、動的ユーザーコントロールをロードするときに、コントロール内のデータが正しくバインドされることですが、ユーザーコントロールがロードされた後、プレポストデータでオーバーライドされます-オーバーライドはポストバックイベントのどこかで発生しています)。ドロップダウンのバインドとそれがページサイクルのどこで発生するかと関係があるように私には思えますが、私は何も特定することができず、グーグルソリューションを思い付くことができませんでした。
Firebugの投稿を見て気付いた奇妙なことの1つは、ドロップダウンのEVENTTARGET値はドロップダウンのUniqueIdでしたが、ボタンをクリックしてもEVENTTARGET値は空です。私の脳はここに何らかのつながりがあると考えています。
参考までに-私はトリックを行うように見える回避策を考え出しました。ドロップダウンの自動ポストバックをfalseに設定し、jQueryを使用して、ドロップダウンに変更イベントを割り当ててボタンクリックを発生させます。これにより、ポストバックが発生し、コードでbtn_clickイベントが発生します。