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
2007-06-03
真遗憾,AutoCompleteExtender竟然不支持多列
自动填充,就我来说,最常用的应该是代码输入,这时,总是要求能显示代码所对应的名称,如此一来,AutoCompleteExtender就不适用了,它竟然不支持多列,令人有种想骂人的冲动!哎,枉费这么多时间来折腾,算了,不要它了.
2007-06-02
添加Ajax自动填充控件(AutoCompleteExtender)所遇到的问题
1、添加AutoCompleteExtender控件
从ajax.asp.net上下载了最新的SampleWebSite,将Bin目录下的Dll中的组件添加到控件面板上。打开既存的网站,在其中一个页面添加了AutoCompleteExtender控件。
2、添加ScriptManager控件
按提示,自动填充控件需要信赖ScriptManager,但是当前页面并非Page页,而是自定义组件,如果直接添加在ascx页面上,相信Page页肯定不能再添加ScriptManager了,若其也需要添加此类依赖组件,则会产生冲突,所以我认为应当添加ScriptManagerProxy来替代。
3、添加自定义的后台ServiceMethod
4、运行。
在文本框输入字符后,未能出现下拉列表框,反复检查代码,未能发现任何问题。
5、检查FireFox的Error Console,发现有脚本错误:
'Sys' is undefined.
定位代码:
<script type="text/javascript">
//<![CDATA[
Sys.WebForms.PageRequestManager._initialize('ctl00$Main$kdkd', document.getElementById('aspnetForm'));
Sys.WebForms.PageRequestManager.getInstance()._updateControls([], [], [], 90);
//]]>
</script>
5、安装FireBug后,发现有好几个URL请求发生了404错误,URI是当前网站根目录下的ScriptResource.axd
6、能过以上,确定了是Web.config的配置问题,缺少axd类型的Handler
7、能过查找,发现一个网上资料:http://codebetter.com/blogs/jay.kimble/archive/2006/10/26/How-To_3A00_-Enable-Microsoft-Ajax-Beta-over-on-an-existing-site.aspx
看了看,一来是E文,另外,有好向个step,感觉有点麻烦。于是决定新建一个“ASP.NET AJAX-Enabled WebSite”,将其自动生成的Web.config直接复制过来,并重新添加我自己的appSettings小节与connectionStrings小节。但位置似乎有讲究,紧跟着放在后,产生编译错误:
错误 38 Only one <configSections> element allowed per config file and if present must be the first child of the root <configuration> element. M:\LingsJob\src.new\Web.config 33
等错误及警告。改变位置,放到</configSections>与<system.web>之间即可。
8、重新编译并运行,在文本框输入时,成功产生XHR,但返回的结果却是错误提示:
Unknown web method XXX.
9、反复检查,未能找出原因,对比AJAX的Sample,索性也改成请求*.asmx再指向AppCode下的WebService类的Public方法。
10、测试成功。
以上是我在使用AutoCompleteExtender所遇的问题及解决措施,方法比较“粗鲁”,而没有去深究细节,个人认为,如非太闲,能实现,就真的是不想去多研究了,感觉做程序,已经是够累了...
从ajax.asp.net上下载了最新的SampleWebSite,将Bin目录下的Dll中的组件添加到控件面板上。打开既存的网站,在其中一个页面添加了AutoCompleteExtender控件。
2、添加ScriptManager控件
按提示,自动填充控件需要信赖ScriptManager,但是当前页面并非Page页,而是自定义组件,如果直接添加在ascx页面上,相信Page页肯定不能再添加ScriptManager了,若其也需要添加此类依赖组件,则会产生冲突,所以我认为应当添加ScriptManagerProxy来替代。
3、添加自定义的后台ServiceMethod
4、运行。
在文本框输入字符后,未能出现下拉列表框,反复检查代码,未能发现任何问题。
5、检查FireFox的Error Console,发现有脚本错误:
'Sys' is undefined.
定位代码:
<script type="text/javascript">
//<![CDATA[
Sys.WebForms.PageRequestManager._initialize('ctl00$Main$kdkd', document.getElementById('aspnetForm'));
Sys.WebForms.PageRequestManager.getInstance()._updateControls([], [], [], 90);
//]]>
</script>
5、安装FireBug后,发现有好几个URL请求发生了404错误,URI是当前网站根目录下的ScriptResource.axd
6、能过以上,确定了是Web.config的配置问题,缺少axd类型的Handler
7、能过查找,发现一个网上资料:http://codebetter.com/blogs/jay.kimble/archive/2006/10/26/How-To_3A00_-Enable-Microsoft-Ajax-Beta-over-on-an-existing-site.aspx
看了看,一来是E文,另外,有好向个step,感觉有点麻烦。于是决定新建一个“ASP.NET AJAX-Enabled WebSite”,将其自动生成的Web.config直接复制过来,并重新添加我自己的appSettings小节与connectionStrings小节。但位置似乎有讲究,紧跟着放在
错误 38 Only one <configSections> element allowed per config file and if present must be the first child of the root <configuration> element. M:\LingsJob\src.new\Web.config 33
等错误及警告。改变位置,放到</configSections>与<system.web>之间即可。
8、重新编译并运行,在文本框输入时,成功产生XHR,但返回的结果却是错误提示:
Unknown web method XXX.
9、反复检查,未能找出原因,对比AJAX的Sample,索性也改成请求*.asmx再指向AppCode下的WebService类的Public方法。
10、测试成功。
以上是我在使用AutoCompleteExtender所遇的问题及解决措施,方法比较“粗鲁”,而没有去深究细节,个人认为,如非太闲,能实现,就真的是不想去多研究了,感觉做程序,已经是够累了...
2007-02-15
招数已老?
asp.net中,在pageLoad()中,检查GridView最新的记录行数,可令人惊讶的是,取来取去,总是之前显示的行数,费了好大的劲,才明白,要在GridView的preRender()中取最新行数,哎,原来如此……,真是招数用老,怎么也转不过弯来,想不到啊,想不到。
参考网址:
http://www.15seconds.com/issue/020102.htm
http://msdn2.microsoft.com/en-us/library/ms178472(VS.80).aspx
参考网址:
http://www.15seconds.com/issue/020102.htm
http://msdn2.microsoft.com/en-us/library/ms178472(VS.80).aspx
Subscribe to Posts [Atom]