0

これは説明が難しいシーンなので、簡単な例をコーディングしました。

<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イベントが発生します。

4

1 に答える 1

0

ドロップダウンフィルをinitイベントに移動し、.NETにビューステートから選択した値をロードさせることで、ここで最初の問題を解決しました

ただし、これを行う際に、selectedindexイベントがすべてのポストバックで発生するようになりました。

于 2012-07-17T14:01:08.617 に答える