两种类型的回发事件

时间:2009-05-27 22:28:42

标签: c# asp.net events gridview postback


1)我发现了两篇文章,每篇文章都对两种类型的回发事件进行了不同的分类:

  

一种资源说两种类型的回发事件是已更改事件(控件实现IPostbackDataHandler),在回发之间更改数据时会触发,然后是已提升事件(控件实现IPostbackEventHandler),由控制器认为合适的服务器控件引发

     

其他文章称这两种类型是立即响应事件和更改事件。根据这篇文章,立即响应事件是实际触发回发的事件


a)哪种分类是正确的?

b)如果第二篇文章是正确的,那么如果TextBox控件有AutoPostBack =“true”,那么TextChanged是否也应该被认为是立即响应事件?


2)当页面由于某些用户操作(然后在事件处理阶段)提交回服务器时,ASP.NET会引发自上次回发以来更改数据的所有控件的事件。最后引发了实际触发回发的事件(例如Click事件)


a)但是如果用户在GridView中选择一行导致回发呢?当GridView由于行选择而导致回发时,则与更简单的控件(如TextBox或Button)不同,该回发导致GridView在事件处理阶段(SelectedIndexChaning和SelectedIndexChanged)中不会触发一个,而是触发多个服务器端事件。

ASP.NET认为哪些GridView事件是导致回发的事件?


谢谢

3 个答案:

答案 0 :(得分:1)

即使Autopostback属性为false,也会在回发时触发SelectedIndexChanged事件(在列表框上)和TextChanged事件(在文本框上)。

尝试将其放在表单上:

   <asp:ListBox runat="server" ID="test" 
        onselectedindexchanged="test_SelectedIndexChanged">
<asp:ListItem >number1</asp:ListItem>
 <asp:ListItem >number2</asp:ListItem>     
</asp:ListBox>

<asp:TextBox runat="server" ID="text" ontextchanged="text_TextChanged" />
<asp:Button runat="server" Text="Click Me" />

,这在后面的代码中:

 protected void test_SelectedIndexChanged(object sender, EventArgs e)
    {
        Response.Write("SelectedIndexChanged");
    }

    protected void text_TextChanged(object sender, EventArgs e)
    {
        Response.Write("TextChanged");
    }

然后运行它,更改所选项目,键入一些文本,然后点击按钮 - 两个事件都会触发。您可以使用Reflector查看事件序列。对于Textbox,RaisePostDataChangedEvent方法是:

 protected virtual void RaisePostDataChangedEvent()
{
    if (this.AutoPostBack && !this.Page.IsPostBackEventControlRegistered)
    {
        this.Page.AutoPostBackControl = this;
        if (this.CausesValidation)
        {
            this.Page.Validate(this.ValidationGroup);
        }
    }
    this.OnTextChanged(EventArgs.Empty);
}

答案 1 :(得分:0)

首先调用SelectedIndexChanging,通常是我进行任何类型更新的地方。 SelectedIndexChanged在SelectedIndexChanging之后发生,因此从技术上讲,页面将SelectedIndexChanging视为导致回发的事件。请记住,回发也会调用页面的整个生命周期,从Init到Page_Load到您的事件。

autopostback属性只是让网站知道在发生任何更改后进行回发,如果textchange,selectedindexchanged,checkedchanged等,如果autopostback属性未设置为true,则不会发生这些事件。

答案 2 :(得分:0)

首先,我觉得这两种分类都是兼容的,只是一种不同的方式。我想你可以说Raised事件等同于Immediate Response事件,这些事件只能在实现IPostbackEventHandler的控件中使用。

所以关于1b,当AutoPostBack = true时,我相信它只是设置一个javascript onchange事件来进行回发调用。一旦回发触发,页面就会检测到文本框已更改并运行已更改的事件。因此,这仍然不是一个凸起的事件。 (我可能错了,但这是我的理解。)

引发事件将是在控件的RaisePostBack方法(IPostBackEventHandler需要)中触发的事件 - 在页面加载循环后触发并触发每个更改事件。

在幕后,可以通过以下两种方式之一进行回发:通过提交表单(带有提交行为的asp:按钮)或通过javascript _doPostBack调用(出现在AutoPostBack = true或直接拨打电话的控件中)使用Page.ClientScript)。