2

リストボックスとSelectedIndexChangedイベントとTextChangedイベントのあるテキストボックスをそれぞれaspxページに配置しました。ここで、テキストボックスに何かを書き込んでから、他の場所をクリックせずにリストボックスの値を選択すると、最初にテキストボックスのテキスト変更イベントが呼び出され、次に選択したリストボックスのインデックス変更イベントが呼び出されます。その後、再びテキストボックスのテキスト変更イベントが呼び出されます。なぜこれが起こっているのか、誰かが洞察を与えることができますか?

以下はマークアップです:

<asp:ListBox ID="ListBox1" runat="server" AutoPostBack="true" OnSelectedIndexChanged="ListBox_IndexChanged">
    <asp:ListItem Text="abc" />
    <asp:ListItem Text="def" />
</asp:ListBox>
<asp:TextBox ID="TextBox1" runat="server" AutoPostBack="true" OnTextChanged="Text_Changed" />

背後にあるコード:

namespace WebApplication1
{
    public partial class _Default : System.Web.UI.Page
    {               
        protected void ListBox_IndexChanged(object sender, EventArgs e)
        {

        }

        protected void Text_Changed(object sender, EventArgs e)
        {

        }
    }
}
4

2 に答える 2

1

問題/問題は、AutoPostBackJavaScriptイベントをコントロールにアタッチすることで機能することです。ブラウザごとにJavaScriptの処理方法が少し異なるため、順序が実際に保証されるわけではありません。

たとえば、Google Chromeでコードを試してみると、次の一連のイベントが発生します。

  1. サーバーに送信されたリクエスト
    1. ListBox_IndexChangedイベントが呼び出されます
    2. Text_Changedイベントが呼び出されます
  2. 応答はクライアントに戻ります

ただし、Internet Explorer 8では、次のシーケンスに気づきました。

  1. サーバーに送信されたリクエスト
    1. Text_Changedイベントが呼び出されます
  2. 応答はクライアントに戻ります
  3. サーバーに送信された 別のリクエスト
    1. ListBox_IndexChangedイベントが呼び出されます
    2. Text_Changedイベントが呼び出されます
  4. 2番目の応答はクライアントに戻ります

これはASP.NETのせいではありませんが、ブラウザー間でJavaScriptの実装を変えるだけだと思います。

イベントの特定のシーケンスに依存する必要がある場合、AutoPostBackそれを削減するつもりはありません。状況によっては、jQueryなどのクロスブラウザー準拠のライブラリを使用して独自のJavaScriptイベントを実装することを検討する場合があります。この関数を使用して、プログラムでサーバーにコールバックできます__doPostBack()

于 2011-03-22T02:01:21.833 に答える
0

新しいアイテムが選択されると、リストボックスのテキスト部分のテキストがアイテムのテキストに置き換えられます。これが、2番目のTextChangedイベントを取得する理由です。

于 2011-02-01T13:34:03.483 に答える