Page_Load()给全局变量赋值,别的控件为何得不到它赋的值呢???
public class Test:System.Web.UI.Page
{
protected System.Web.UI.WebControls.Button btn1;
private int i;
private void Page_Load(object sender, System.EventArgs e)
{
……
i = 100;
……
}
private void btn1_Click(object sender, System.EventArgs e)
{
Response.Write("i = " + i); //i = 0 ???????
}
}
为什么会这样????
问题点数:10、回复次数:15Top
1 楼saucer(思归)回复于 2005-03-04 00:32:29 得分 1
1. are you sure Page_Load is executed? did you hook up Page_Load with Page's Load event?
2. make sure i=100 is not inside if (!IsPostBack)Top
2 楼noyester()回复于 2005-03-04 00:34:22 得分 1
思归大哥说的没错
记得新建立每个新页面的时候,最先做的事情就是加
if not me.ispostback
end ifTop
3 楼ghx88(辉)回复于 2005-03-04 00:40:28 得分 0
Page_Load是运行了,i 也赋给了其它函数并正确运行,i 也放在if(!IsPostBack){……}中了,但btn1_Click()中的i还是初始值!我试过i 加上 static 关键字就可以,不过我就是不明白为何是这样的?Top
4 楼ghx88(辉)回复于 2005-03-04 00:42:57 得分 0
第一次运行时Page_load就赋值给i了,就算回不回传i 也应该是100,这与IsPostBack无关!Top
5 楼ghx88(辉)回复于 2005-03-04 00:52:13 得分 0
啊!我发现问题了! i放在if(!IsPostBack){……}中 i ,btn1就得不到正确的值,反之就正常!为何这样呢?难道if(!IsPostBack){……}中的 i 是自动生成的吗??此 i 不是彼 i ??Top
6 楼saucer(思归)回复于 2005-03-04 00:53:35 得分 0
come on, when you do a postback, the code inside the if block will not be executedTop
7 楼lau_marco(青苹果)回复于 2005-03-04 00:55:49 得分 1
是不是要把private换成public???Top
8 楼lau_marco(青苹果)回复于 2005-03-04 01:10:07 得分 1
加了static时,该变量就成了全局变量了,当然可在类中的方法中传递了
但现在的private是不行的Top
9 楼eagle40(老鹰)回复于 2005-03-04 02:49:42 得分 1
其实不论是在第一次加载Page,还是后续的PostBack,所有的变量都被Reset了。所以把i放在if block中,在PostBack时是不会被赋值的(保持了默认的值:0)。
搂住大概是从winform转过来的。在winform中使用没有赋值的变量是不能通过编译的,但在webform中系统是不做检查的。Top
10 楼LoveCherry(论成败,人生豪迈;大不了,重头再来!^_^)回复于 2005-03-04 07:07:02 得分 1
http://blog.csdn.net/lovecherry/archive/2005/03/01/306012.aspx
再看看我的问题吧:)Top
11 楼ghx88(辉)回复于 2005-03-04 08:16:44 得分 0
我还是似懂非懂的Top
12 楼zhang5wen(搏击风云)回复于 2005-03-04 08:47:19 得分 0
添加一个独立的CS模块或类文件,把private int i;改public int i;就可以了
Top
13 楼shield0771(shield)回复于 2005-03-04 09:26:04 得分 2
以前也碰到这个问题,我的理解是ASP.NET页面生命期造成的
在WEB中类的实例并不像WINDOWS中一样NEW了以后就可以一直使用,WEB页面是在每次客户请求时重新实例化类的新实例,这个实例在完成此次请求并把需要的数据发送回客户端后就释放了,下一次请求又会生成新的实例处理数据;因为是每次请求都生成新的实例,系统会用视图状态来保存一些客户端设置值和属性来填充新实例保证操作过程的连贯(确保不丢失页面数据,使两次请求后的页面看起来一致);但是在类中的全局变量是不会保存到视图状态并还原的,所以在每次提交请求后数值都会丢失
以上是我的理解,不知道对不对Top
14 楼zyug(LovlyPuppy)回复于 2005-03-04 09:36:14 得分 2
但是在类中的全局变量是不会保存到视图状态并还原的,
这点我和你看法不同
asp.net的页面生存周期是很长的,你不信你可以多增加int 或是string变量的个数,viewstate的长度你可以看到明显变长了,它是靠viewstate 来维护的
楼主的代码哪里可能有错误,替换掉了,这点我专门试过的Top
15 楼ghx88(辉)回复于 2005-03-04 12:39:43 得分 0
多谢高见!Top




