1)我发现了两篇文章,每篇文章都对两种类型的回发事件进行了不同的分类:
一种资源说两种类型的回发事件是已更改事件(控件实现IPostbackDataHandler),在回发之间更改数据时会触发,然后是已提升事件(控件实现IPostbackEventHandler),由控制器认为合适的服务器控件引发
其他文章称这两种类型是立即响应事件和更改事件。根据这篇文章,立即响应事件是实际触发回发的事件
a)哪种分类是正确的?
b)如果第二篇文章是正确的,那么如果TextBox控件有AutoPostBack =“true”,那么TextChanged是否也应该被认为是立即响应事件?
2)当页面由于某些用户操作(然后在事件处理阶段)提交回服务器时,ASP.NET会引发自上次回发以来更改数据的所有控件的事件。最后引发了实际触发回发的事件(例如Click事件)
a)但是如果用户在GridView中选择一行导致回发呢?当GridView由于行选择而导致回发时,则与更简单的控件(如TextBox或Button)不同,该回发导致GridView在事件处理阶段(SelectedIndexChaning和SelectedIndexChanged)中不会触发一个,而是触发多个服务器端事件。
ASP.NET认为哪些GridView事件是导致回发的事件?
谢谢
答案 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)。