以下のようなマークアップがあります。
<asp:DropDownList ID="dd1" AutoPostBack="true" runat="server">
<asp:ListItem Value="1">1</asp:ListItem>
<asp:ListItem Value="2">2</asp:ListItem>
</asp:DropDownList>
<asp:DropDownList ID="dd2" AutoPostBack="true" onchange="javascript:return true;" runat="server">
<asp:ListItem Value="1">3</asp:ListItem>
<asp:ListItem Value="2">4</asp:ListItem>
</asp:DropDownList>
配線はこのようになっています。
Protected Sub changed1(sender As Object, e As EventArgs) Handles dd1.SelectedIndexChanged
End Sub
Protected Sub changed2(sender As Object, e As EventArgs) Handles dd2.SelectedIndexChanged
End Sub
dd2'のインデックスが変更されたとき、そのハンドラが起動すると思いますよね? しかし、そうではありません。 代わりに、このハンドラはキューに入れられ、dd1のインデックスが変更されたときにdd1のハンドラが実行された後に実行されます。 dd2から onchange="javascript:return true;"
を取り除くと、正常に実行されます。
どなたか、何が起きているのかお分かりになる方はいらっしゃいますか?
編集:私の最初の答えは、ドロップダウンリストでreturn式を使用すると、ボタンのクリックイベントと同じようには動作しないということです。
**しかし、私は以前にドロップダウンリストでこれを行ったと確信しています。
__doPostBack("<%=dd2.ClientID %>", '');
.
私はこれをしなければならない理由がわからない'しかし、それは動作します。 しかし、私はまだ他の方法で行いたいので、誰かが知っていれば、私はあなたを回答としてマークすることができますので、教えてください。
その必要は全くないはずです。AutoPostBackを true に設定し、検証を回避する必要がある場合は
CausesValidation` を false に設定するだけです。
<asp:DropDownList ID="DropDownList1" runat="server" AutoPostBack="true" CausesValidation="false" OnSelectedIndexChanged="DropDownList1_SelectedIndexChanged" />
なぜか、ボタンの onclick イベントのように、クライアント側の onchange イベントで false を返すことで、ドロップダウンのサーバーイベントをキャンセルできると思っていました (例: onclick="javascript:return false;"
)。
私が最終的に行ったのは、関数で条件をチェックすることです。 もしtrueなら、これを実行します。
__doPostBack("<%=dd2.ClientID %>", '');
そうでなければ、それはしません'。