您的位置:程序门 -> .net技术 -> asp.net



讨论关于访问类的非静态属性100分!


[收藏此页] [打印本页]选择字色:背景色:字体:[][][]


讨论关于访问类的非静态属性100分![已结贴,结贴人:thinkinginboy]
发表于:2007-07-25 11:09:53 楼主
很简单的一个问题.看看各位的思路

类a里有个int类型变量temp=0     在程序的运行过程中它的值变为50

在按钮事件中要访问temp.于是写了以下代码

a   obja   =   new   a();
response.write(obja.temp.tostring());

因为obja是实例化出来的所以访问obja.temp的时候temp的值为0

请教很弱的一个问题.如何能访问到在a类里值为50的temp?       100分~
发表于:2007-07-25 11:12:371楼 得分:0
楼主以前是做winform的吧,webform是不会保存状态的。

所以你在page_load中设置为50了,在页面点击按钮postback回服务器的时候,temp会变成初始值。
----------------
如果你想保存50,可以保存到viewstate、session中
发表于:2007-07-25 11:13:562楼 得分:0
a   obja   =   new   a();
response.write(obja.temp.tostring());
--------
对了,你这个obja是新new的1个实例,所以值肯定是默认值0
发表于:2007-07-25 11:14:133楼 得分:0
temp不是在page_load中设置为50而是在类里面设置的

现在要从page_load中读取类里的temp
发表于:2007-07-25 11:24:314楼 得分:0
详细点~
发表于:2007-07-25 11:25:065楼 得分:0
如果没有代码修改obja.temp的值,那这个值就永远保持为0
发表于:2007-07-25 11:28:536楼 得分:0
@   antoniusguo(anton)
如果没有代码修改obja.temp的值,那这个值就永远保持为0
-------------------------------------------------------------
类a里有个int类型变量temp=0   在程序的运行过程中它的值变为50
发表于:2007-07-25 11:32:557楼 得分:0
thinkinginboy()   (   )   信誉:100     2007-07-25   11:28:53     得分:   0    
 
 
      @   antoniusguo(anton)
如果没有代码修改obja.temp的值,那这个值就永远保持为0
-------------------------------------------------------------
类a里有个int类型变量temp=0   在程序的运行过程中它的值变为50
   
-----------------------------------------------------------------
那等它变成50了再取不就行了???被楼主搞晕了!
发表于:2007-07-25 11:34:008楼 得分:0
a   obja   =   new   a();
把你a的代码贴出来看看!!!
发表于:2007-07-25 11:34:189楼 得分:0
楼主思维混乱~
发表于:2007-07-25 11:34:5110楼 得分:0
public   class     a
{
        public   int   temp   =   50;
}

public   partial   class   filetest   :   system.web.ui.page
{
       
        protected   void   page_load(object   sender,   eventargs   e)
        {
                a   obja   =   new   a();        
                response.write(obja.temp   );

        }
}
結果輸入是   50,沒有問題。

但在   b/s開發裡,不兗許出現在如下情況
public   class     a
{
        public   int   temp   =   50;
}

public   partial   class   filetest   :   system.web.ui.page
{
        a   obja;
        protected   void   page_load(object   sender,   eventargs   e)
        {
                if   (!   ispostback)
                {
                        obja   =   new   a();
                        response.write(obja.temp);
                }
        }
       
        //因為,這個事件觸發時,整個頁會重新刷新,
  //原來在   load裡實
        protected   void   button1_click(object   sender,   eventargs   e)
        {
                response.write(obja.temp);
        }
}
发表于:2007-07-25 11:36:3311楼 得分:0
建议楼主先把基础知识学好再来写代码~
发表于:2007-07-25 11:38:4612楼 得分:0
public   class     a
{
        public   int   temp   =   50;
}

public   partial   class   filetest   :   system.web.ui.page
{
       
        protected   void   page_load(object   sender,   eventargs   e)
        {
                a   obja   =   new   a();        
                response.write(obja.temp   );

        }
}
結果輸入是   50,沒有問題。

但在   b/s開發裡,不兗許出現在如下情況
public   class     a
{
        public   int   temp   =   50;
}

public   partial   class   filetest   :   system.web.ui.page
{
        a   obja;
        protected   void   page_load(object   sender,   eventargs   e)
        {
                if   (!   ispostback)
                {
                        obja   =   new   a();
                        response.write(obja.temp);
                }
        }
       
        //因為,這個事件觸發時,整個頁會重新刷新,
  //原來在   load裡實的對像已不存在
        protected   void   button1_click(object   sender,   eventargs   e)
        {
                response.write(obja.temp);//所以,這裡將報錯,obja沒有實例化
        }
}

如果你想保存obja的狀態,所以這如下做。
[system.serializable]
public   class   a
{
        public   int   temp   =   50;
}

public   partial   class   filetest   :   system.web.ui.page
{
        a   obja;
        protected   void   page_load(object   sender,   eventargs   e)
        {
                if   (!ispostback)
                {
                        obja   =   new   a();

                        viewstate[ "obja_save "]   =   obja;

                        response.write(obja.temp);
                }

        }

        protected   void   button1_click(object   sender,   eventargs   e)
        {
                obja   =   (a)viewstate[ "obja_save "];
                response.write(obja.temp);
        }


发表于:2007-07-25 11:52:2913楼 得分:0
比如这个类是这样的
public   class   a
{
        public   a()
        {};
        public   int   temp   =   0;
        public   void   function()
        {
                temp=50;
        }
}
在page_load的时候
a   obja   =   new   a();
访问obja.temp肯定是0了

后来按2楼的意思把temp=50存储到session中,代码:
httpcontext.current.session.add( "temp ",temp);

在调试的时候temp的值为50,运行到上面这句代码提示空引用异常.
发表于:2007-07-25 11:54:1414楼 得分:0
**************************************接上面那段..在a类里我已经通过其他方法调用了
**************************************function();可以确定temp的值为50
发表于:2007-07-25 11:56:3115楼 得分:0
还是我说的:

所以你在page_load中设置为50了,在页面点击按钮postback回服务器的时候,temp会变成初始值。
----------------
如果你想保存50,可以保存到viewstate、session中
发表于:2007-07-25 11:59:5116楼 得分:0
因為那個對像在回送後,也沒了嘛,你把這個對像全保存不就中以了嗎?
发表于:2007-07-25 12:03:0417楼 得分:0
@bearrui(开心熊   ¦   byd,我为你哭泣...)

我的temp是在类里面的,用了你的方法保存到session中

httpcontext.current.session.add( "temp ",temp);

提示httpcontext.current空引用异常.
发表于:2007-07-25 12:05:4818楼 得分:0
response.write(obja.temp); 這句中的   temp哪裡來的?
要保存一個對像成員也要   obja.temp嘛
发表于:2007-07-25 12:07:4519楼 得分:0
當然這不是我的方法,我的方法是:
[system.serializable]
public   class   a
{
        public   int   temp   =   50;
}

public   partial   class   filetest   :   system.web.ui.page
{
        a   obja;
        protected   void   page_load(object   sender,   eventargs   e)
        {
                if   (!ispostback)
                {
                        obja   =   new   a();
                        response.write(obja.temp);   //輸出50
                        obja.temp   =   100;
                        viewstate[ "obja_save "]   =   obja;   //保存整個對像
                }

        }

        protected   void   button1_click(object   sender,   eventargs   e)
        {
                obja   =   (a)viewstate[ "obja_save "];//把對像還原過來
                response.write(obja.temp);//輸出   100
        }

//樓主注意基礎知道的學習
发表于:2007-07-25 12:14:0420楼 得分:0
貌似

哪里碰到过哦
发表于:2007-07-25 12:15:2321楼 得分:0
晕。

public   class   class1
        public   temp   as   integer
        sub   new()
                temp   =   50
        end   sub
end   class

访问时
        protected   sub   page_load(byval   sender   as   object,   byval   e   as   system.eventargs)   handles   me.load
                response.write(new   class1().temp)
        end   sub
发表于:2007-07-25 12:15:3522楼 得分:0
楼上的

obja   =   new   a();
response.write(obja.temp);   //輸出50
obja.temp   =   100;
viewstate[ "obja_save "]   =   obja;   //保存整個對像
-----------------------------------------------------------
response.write(obja.temp);   //輸出50----------这样是访问到了temp的初始值50
你的obja.temp   =   100;是在page_load中赋的值.这样做肯定可以访问到值为100
而我的temp=100是在类里给它赋值的//现在是想通过page_load访问类里的100

你的例子我明白.类里声明temp-> page_load改变值-> 其他事件访问到改变的值

我的是   类里声明temp-> 类里改变temp的值-> 其他事件访问到改变的值
发表于:2007-07-25 12:23:0323楼 得分:0
web開發與   windows開發,在數據狀態保存上有很大的區別,這是由於   web存在一個回送的問題。
每回送一次,整修個頁對像就要重新構造,
所以,原來的數據對像全部還原,load事件也將會重新再次執行,
不同的是,ispostback   將會為   true.
要保存頁面狀態有很多方法,   cookie,session,request,viewstate等等
樓主先去了解一下這知識吧
发表于:2007-07-25 12:28:2024楼 得分:0
用属性吧,别用字段:
class   a
{
        private   statebag   viewstate;
        public   a(statebag   viewstate)   {   this.viewstate   =   viewstate;}
        public   int   temp
        {
                get{return   (int)this.viewstate[ "a.temp "]}
                set{this.viewstate[ "a.temp "]   =   value;}
        }
}
发表于:2007-07-25 12:28:2225楼 得分:0
//类里声明temp-> 类里改变temp的值-> 其他事件访问到改变的值

类里改变temp的值?什麼時候改?能在類裡改,為什麼不能在外面改?只要提供公共方法或者屬性就可以了。


发表于:2007-07-25 12:29:3726楼 得分:0
汗了..我是在类里改变值..你们贴的代码都是在page_load改变变量的值

这样做当然可以访问到...这我也清楚。....可能真的是我没表达清楚

我的目的说白了就是要访问一个类里已经改变值的变量
发表于:2007-07-25 12:32:1427楼 得分:0
用属性传值
private   int   temp;
public   int   temp
{
get
{
return   temp;
}
set
{
if(temp!=value)
temp=value;
}
}
//其他页面
a   obja   =   new   a();
response.write(obja.temp.tostring());
发表于:2007-07-25 12:38:4028楼 得分:0
@回复人:wowangpeng()
类里改变temp的值?什麼時候改?能在類裡改,為什麼不能在外面改?只要提供公共方法或者屬性就可以了。
---------------------------------------------------------------------------------
页面触发事件-> 事件访问类-> 类中读取某个文件的大小给变量->

页面触发第2个事件通过page_load访问这个类的变量,在客户端显示这个文件的大小...

我不知道这样是不是说清楚了...
发表于:2007-07-25 12:41:2429楼 得分:0
把你的代码再贴详细点

特别是那个返回是有条件的
发表于:2007-07-25 12:41:3130楼 得分:0
@ojekleen(三尾)

你明白我的意思了但是
------------------------------------------
//其他页面
a   obja   =   new   a();
response.write(obja.temp.tostring());

这里读取到的obja.temp.tostring()是temp的初始值0..不是已经改变的50
发表于:2007-07-25 12:42:0931楼 得分:0
web应用,无状态性。。变更值要保存。viewstate、session都可以。
发表于:2007-07-25 13:31:2932楼 得分:0
学习
发表于:2007-07-25 13:34:5633楼 得分:0
[system.serializable]
public   class   a
{
        public   int   temp   =   50;
        public   void   settemp()
        {
                temp   =   330;//假設獲取的文件大小是330;
        }

}

public   partial   class   filetest   :   system.web.ui.page
{
        a   obja;
        protected   void   page_load(object   sender,   eventargs   e)
        {
                if   (!ispostback)
                {
                        obja   =   new   a();
                        response.write(obja.temp);   //輸出50
                        obja.temp   =   100;
                        viewstate[ "obja_save "]   =   obja;
                }

        }
        protected   void   button1_click(object   sender,   eventargs   e)
        {
                obja   =   (a)viewstate[ "obja_save "];
                obja.settemp();
                viewstate[ "obja_save "]   =   obja;
        }
        protected   void   button2_click(object   sender,   eventargs   e)
        {
                obja   =   (a)viewstate[ "obja_save "];
                response.write(obja.temp);//輸出   330

        }
发表于:2007-07-25 13:40:3734楼 得分:0
在页面设置后存入session
发表于:2007-07-25 13:47:1335楼 得分:0
當然,這種方法,要保存整修對像,對像做出修改後,又要保存,有點浪費資源。
還有更好的辦法,就是,你的獲取文件大小方法直接返回這個文件大小   size,這個文件小在size   page裡 用   veiwstate保存。
如:
public   class   a
{
       
        public   int   gettemp()
        {
                return     330;//假設獲取的文件大小是330;
        }
}

public   partial   class   filetest   :   system.web.ui.page
{
        public   int   size
        {
                get   {
                        if   (viewstate[ "size "]!=null     &&   viewstate[ "size "].tostring()   !=   string.empty)
                        {
                                return   convert.toint32(viewstate[ "size "]);
                        }
                        else   {
                                return   0;
                        }

                }
                set   {                    
                        viewstate[ "size "]   =   value;              
              }
        }

        //第一個事件訪問類
        protected   void   button1_click(object   sender,   eventargs   e)
        {
                this.size   =(new   a()).gettemp();
        }

        //第二個獲取這個類結果並顯示        
        protected   void   button2_click(object   sender,   eventargs   e)
        {
                response.write(this.size);
        }
发表于:2007-07-25 13:49:4336楼 得分:0
貌似大家都解决了
发表于:2007-07-26 11:52:0737楼 得分:0
感谢楼上各位的大力支持.

现在可以存储到session里面了.原先在类里写的httpcontext.current.session.add( "temp ",temp);
提示httpcontext.current空引用异常
后来我把外面的一个线程注释掉就可以正常存储了也没出现异常了.不知道是怎么回事

把temp的值存储到session以后下面一行代码:string   str=session[ "temp "].tostring();
可以发现str的值确实为新的值50   !

接下来通过xmlhttp访问临时页面getsessioninfo.aspx的page_load

page_load代码也很简单:
判断session不为空的时候
response.write(session[ "temp "].tostring());
调试的时候发现编译器没有执行这句,而且session[ "temp "].tostring()的值也是null
怀疑是session无意中丢失了值.但是多次运行都是这样的结果.再次请教各位!
发表于:2007-07-26 12:19:3738楼 得分:0
在同一個頁裡保存狀態推薦用viewstate,我給樓主這麼好的例子,不知道為什麼不去試一試,哎,,,,無語。最好不要用session,session不太穩定,容易丟失,還有,很費資源。
我們開發裡,基本不用session,萬不得已,也就用   cookies,
发表于:2007-07-26 12:32:0339楼 得分:0
如果你这个a变量不是会话相关,而是当前webform相关的,那么建议使用viewstate而不是session。
发表于:2007-07-26 12:48:4140楼 得分:0
好的.我再试一下wowangpeng()提供的办法
发表于:2007-07-26 13:22:0441楼 得分:0
写的时候:this.viewstate[ "a "]=obja.temp

读的时候:   response.write(this.viewstate[ "a "].tostring());
发表于:2007-07-26 13:59:0142楼 得分:0
用静态类,这个属性初始值赋为50,这样无论哪个用户访问这个变量都是50

当然,前提是没有其它代码更改这个值
发表于:2007-07-26 14:20:1643楼 得分:0
帮顶一下
发表于:2007-07-26 17:48:3944楼 得分:0
谢谢wowangpeng,用
发表于:2007-07-26 17:55:3345楼 得分:0
谢谢wowangpeng,用viewstate已经可以在其他页面的page_load中访问到类里的值了

不过要说的一个是,在自己创建的类里是不支持viewstate的,必须继承page.

一个问题解决了另外一个问题又来了.在page_load中通过viewstate已经可以访问到temp的值

奇怪的是response.write(viewstate[ "temp "].tostring());xmlhttp没有任何反映

代码贴出来给大家看


        <script   language= "javascript "   type= "text/javascript ">
//   jscript   文件

var   xmlhttp;      
function   createxmlhttprequest()   {

//如果是ie,用activexobject
        if   (window.activexobject)   {
                xmlhttp   =   new   activexobject( "microsoft.xmlhttp ");
        }  

//如果其它浏览器就用xmlhttprequest
        else   if   (window.xmlhttprequest)   {
                xmlhttp   =   new   xmlhttprequest();
        }
}    
//开始函数
function   requestserver()
{      
        window.setinterval( 'startrequest() ',1000);
}

function   startrequest()   {
     
        createxmlhttprequest();
        //创建一个新的http请求,并指定此请求的方法、url以及验证信息
        xmlhttp.open( "get ", 'getfileinfo.aspx ',   true);
        //指定当readystate属性改变时执行的函数
        xmlhttp.onreadystatechange   =   handlestatechange;
        //发送请求到http服务器并接收回应
        xmlhttp.send(null);
}

function   handlestatechange()   {
 //4数据接收完毕
        if(xmlhttp.readystate   ==   4)   {
                //200返回请求状态为ok
                if(xmlhttp.status   ==   200)   {
   //弹出对话框,并输入内容
      try{
        //alert(xmlhttp.responsetext);
        document.getelementbyid( "fileuploadstate ").innerhtml+=xmlhttp.responsetext;
      }
      catch(e)
      {
        document.all[ 'fileuploadstate '].innerhtml=e;
      }
                }
        }
}
        </script>

----------------------------------------------------------------------------
protected   void   page_load(object   sender,   eventargs   e)
{
        if   (viewstate[ "temp "]   !=   null)
        {
                response.write(viewstate[ "temp "].tostring());
        }
        else
        {
                response.write( "0 ");
        }
}
发表于:2007-07-26 18:05:0146楼 得分:0
看不懂
发表于:2007-07-26 18:11:0947楼 得分:0
........

这个是很简单的ajax   xmlhttp啊
发表于:2007-07-26 18:25:2048楼 得分:0
mark
发表于:2007-07-27 08:23:4249楼 得分:0
1。我給你提供了兩個例子,前一個例子是在page裡保存整個對像,在你那個類裡基本就沒有用
  viewstate,後一個例子,是保存從對像的一個方法裡返回的值到viewstate裡。用不著在自己创建的类里是支持viewstate的。
2。你這個問題與   viewstate沒有關系的呀,如果你不信,你直接在page_load事件裡來個
  response.write( "abcd ");試試,也沒有反應。這是你應用   ajax的問題,建議你采用ajaxpro。

发表于:2008-01-20 12:03:2650楼 得分:0
好帖子
发表于:2008-01-20 12:05:4551楼 得分:0
1。我給你提供了兩個例子,前一個例子是在page裡保存整個對像,在你那個類裡基本就沒有用  
  viewstate,後一個例子,是保存從對像的一個方法裡返回的值到viewstate裡。用不著在自己创建的类里是支持viewstate的。  
2。你這個問題與       viewstate沒有關系的呀,如果你不信,你直接在page_load事件裡來個  
    response.write(   "abcd   ");試試,也沒有反應。這是你應用       ajax的問題,建議你采用ajaxpro。  
------------------------------------------------------------------------------------
同意
发表于:2008-01-20 12:08:2852楼 得分:100
用static单件模式就可以了


快速检索

最新资讯
热门点击