2

我在 aspx 页面中分别放置了一个列表框和一个带有 Selected Index Changed 和 Text Changed 事件的文本框。现在,如果我在文本框中写了一些东西,然后没有单击其他地方,在列表框中选择一个值,那么首先调用文本框的 Text Changed 事件,然后调用列表框的选定索引更改事件。之后再次调用文本框的 Text Change 事件。任何机构都可以提供一些见解为什么会发生这种情况?

下面是标记:

<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

问题/问题是AutoPostBack通过将 JavaScript 事件附加到您的控件来工作。每个浏览器对 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. 第二个响应返回给客户端

我想这不是 ASP.NET 的错误,而只是跨浏览器的不同 JavaScript 实现。

如果您需要依赖特定的事件序列,AutoPostBack则不会削减它。根据您的情况,我可能会考虑使用像jQuery这样的跨浏览器兼容库来实现我自己的 JavaScript 事件。__doPostBack()您可以使用该函数以编程方式回调服务器。

于 2011-03-22T02:01:21.833 回答
0

选择新项目时,列表框文本部分中的文本将替换为该项目的文本。这就是您获得第二个 TextChanged 事件的原因。

于 2011-02-01T13:34:03.483 回答