2007-07-05
关于 FormView 状态的判断
在一个页面,想要根据 FormView 的状态来切换按钮显示时,在不同的事件里,取得的 FormView 状态会有不同。
例如:当前的 FormView 是 Insert 状态,点击 Insert 按钮,在 Inserted 事件中,将状态切换到 ReadOnly 时,在不同的页面事件中,取到的 FormView 的 CurrentMode 是不同的。要想在页面输出时,根据 FormView 状态切换按钮显示,要选择合适的事件。
最初,我使用 Page_Load 事件来进行处理,但发现取到的状态不正确。在上面举例的操作过程中,我预想的结果是 ReadOnly,然而实际上却是 Insert 状态。经过了解,最后使用 Page_PreRenderComplete 事件正确取得 FormView 的状态。
首先,需要了解页面生命周期中,各事件的先后顺序,简单列几个事件的次序:
1、Page_PreLoad
2、Page_Load
3、RaiseChangedEvents(各个控件的 Changed 事件)
4、RaisePostBackEvent(各个控件的处理事件,如 onClick 等)
5、Page_LoadComplete
6、Control_PreRender
7、Page_PreRenderComplete
为此,我写了一个测试程序,在各个事件中输出日志记录,部分内容如下:
<Log Date="2007-07-05 12:51:09 5603808" Level="Debug_Level">Page_PreLoad</Log>
<Log Date="2007-07-05 12:51:09 5603808" Level="Debug_Level">FormMode:Insert</Log>
<Log Date="2007-07-05 12:51:09 5904240" Level="Debug_Level">Page_Load</Log>
<Log Date="2007-07-05 12:51:09 6004384" Level="Debug_Level">FormMode:Insert</Log>
<Log Date="2007-07-05 12:51:09 6505104" Level="Debug_Level">Page_LoadComplete</Log>
<Log Date="2007-07-05 12:51:09 6505104" Level="Debug_Level">FormMode:ReadOnly</Log>
<Log Date="2007-07-05 12:51:09 6705392" Level="Debug_Level">FormView_PreRender</Log>
<Log Date="2007-07-05 12:51:09 6705392" Level="Debug_Level">FormMode:ReadOnly</Log>
<Log Date="2007-07-05 12:51:09 6705392" Level="Debug_Level">Page_PreRenderComplete</Log>
<Log Date="2007-07-05 12:51:09 6705392" Level="Debug_Level">FormMode:ReadOnly</Log>
从日志记录中可以看出,要到 Page_LoadComplete 事件时,FormView 的状态才由 Insert 状态切换到 ReadOnly 状态。而我在开始编写ASP.Net程序时,总是想当然地以为在 Page_Load 事件时,所有的控件都已经加载并处理完毕。
同样,在 Page_Load 事件中,如果查看 GridView 的行数,所取得的结果是变更前的行数,而不是最终输出到客户浏览器后的行数。在 Page_Load 事件中所取得的行数,可能是从ViewState 中取得原始数据,是系统状态的还原结果,还没有去处理用户事件并重新检索数据。
综上,或许我们应该先花点时间了解页面的生命周期,从网上,我搜索到一些相关内容的网页,摘录以参考。
1、Asp.Net Page LiftCycle(页面生命周期)
这在以前,我也看到过这张图,但不在自己电脑上,未保存,后来再想找时,一直没找到,呵呵,和这页面的作者差不多:-)
另外,这张图中,似乎少了些事件,如 Page_PreRenderComplete。 而图例中的 Adapter 和 Page Persister 是什么意思也不懂。
2、ASP.NET 应用程序生命周期概述(MSDN的文章)
3、客观看待ViewState对Asp.net程序作用和影响(某位博客的文章)
例如:当前的 FormView 是 Insert 状态,点击 Insert 按钮,在 Inserted 事件中,将状态切换到 ReadOnly 时,在不同的页面事件中,取到的 FormView 的 CurrentMode 是不同的。要想在页面输出时,根据 FormView 状态切换按钮显示,要选择合适的事件。
最初,我使用 Page_Load 事件来进行处理,但发现取到的状态不正确。在上面举例的操作过程中,我预想的结果是 ReadOnly,然而实际上却是 Insert 状态。经过了解,最后使用 Page_PreRenderComplete 事件正确取得 FormView 的状态。
首先,需要了解页面生命周期中,各事件的先后顺序,简单列几个事件的次序:
1、Page_PreLoad
2、Page_Load
3、RaiseChangedEvents(各个控件的 Changed 事件)
4、RaisePostBackEvent(各个控件的处理事件,如 onClick 等)
5、Page_LoadComplete
6、Control_PreRender
7、Page_PreRenderComplete
为此,我写了一个测试程序,在各个事件中输出日志记录,部分内容如下:
<Log Date="2007-07-05 12:51:09 5603808" Level="Debug_Level">Page_PreLoad</Log>
<Log Date="2007-07-05 12:51:09 5603808" Level="Debug_Level">FormMode:Insert</Log>
<Log Date="2007-07-05 12:51:09 5904240" Level="Debug_Level">Page_Load</Log>
<Log Date="2007-07-05 12:51:09 6004384" Level="Debug_Level">FormMode:Insert</Log>
<Log Date="2007-07-05 12:51:09 6505104" Level="Debug_Level">Page_LoadComplete</Log>
<Log Date="2007-07-05 12:51:09 6505104" Level="Debug_Level">FormMode:ReadOnly</Log>
<Log Date="2007-07-05 12:51:09 6705392" Level="Debug_Level">FormView_PreRender</Log>
<Log Date="2007-07-05 12:51:09 6705392" Level="Debug_Level">FormMode:ReadOnly</Log>
<Log Date="2007-07-05 12:51:09 6705392" Level="Debug_Level">Page_PreRenderComplete</Log>
<Log Date="2007-07-05 12:51:09 6705392" Level="Debug_Level">FormMode:ReadOnly</Log>
从日志记录中可以看出,要到 Page_LoadComplete 事件时,FormView 的状态才由 Insert 状态切换到 ReadOnly 状态。而我在开始编写ASP.Net程序时,总是想当然地以为在 Page_Load 事件时,所有的控件都已经加载并处理完毕。
同样,在 Page_Load 事件中,如果查看 GridView 的行数,所取得的结果是变更前的行数,而不是最终输出到客户浏览器后的行数。在 Page_Load 事件中所取得的行数,可能是从ViewState 中取得原始数据,是系统状态的还原结果,还没有去处理用户事件并重新检索数据。
综上,或许我们应该先花点时间了解页面的生命周期,从网上,我搜索到一些相关内容的网页,摘录以参考。
1、Asp.Net Page LiftCycle(页面生命周期)
这在以前,我也看到过这张图,但不在自己电脑上,未保存,后来再想找时,一直没找到,呵呵,和这页面的作者差不多:-)
另外,这张图中,似乎少了些事件,如 Page_PreRenderComplete。 而图例中的 Adapter 和 Page Persister 是什么意思也不懂。
2、ASP.NET 应用程序生命周期概述(MSDN的文章)
3、客观看待ViewState对Asp.net程序作用和影响(某位博客的文章)
Labels: Asp.net
Subscribe to Posts [Atom]