以前,对全局的变量赋值一般都是放在PAGE_LOAD中,
比如:public  CityModel city; protected void Page_Load(object sender, EventArgs e)
 {
          city = (CityModel)Session["City"];
 }然后如果下面中的一个ObjectDataSource的Selecting再作调用比如:
 protected void ObjectDataSource1_Selecting(object sender, ObjectDataSourceSelectingEventArgs e)
 {
        e.InputParameters["CityId"] = city.CityId;
 }也倒是一直没有出过错。
不过,今天先写了一个页面。大体上也和上面差不多,不过多了一个button_onclick事件,而且这个button事件与全局变量
一点关系也都没有,并且也和databound也没有关系。一次打开页面时正常,但当按了button后  postback的时候就报错了,报错的地方是在ObjectDataSource1_Selecting说 city 为 null但明明我是在page_load中初始化的啊,而且也没有加if(!ispostback)语句。后来我单步跟踪,发现居然ObjectDataSource1_Selecting先于page_load事件,晕了!为了解决问题,我不得不把city = (CityModel)Session["City"];
放在了 void OnInit(EventArgs e)事件中。
从而才不报错了,但一直想不明白为什么,之前我一直是认为page_load是先于数据绑定的啊,请大侠们赐教!!!解开小弟中的疑惑!谢谢了!

解决方案 »

  1.   

    如果你不用objdatesourse来绑定数据还会这样么?
      

  2.   

    但一直想不明白为什么,之前我一直是认为page_load是先于数据绑定的啊, 
    ------------------------------------------------------------------非也非也!第一绑定数据时,数据是从数据库去拿,你什么时候绑定数据,Selecting事件就是什么时候发生,但是一般你去bind数据的时候都是在PageLoad之后自己去做的,所以Selecting事件好像都是在PageLoad之后。
    但是第二次绑定时,有时候数据是来自ViewState里面的,根据ViewState的值来还原控件的数据,还原ViewState是在LoadViewState中进行的,而LoadViewState发生在OnInit之后PageLoad之前。这样就发生你看到的情况。
      

  3.   

    page_load 事件先执行
    ObjectDataSource的Selecting 事件后执行
    单步跟踪调试,寻找错误点
      

  4.   

    ObjectDataSource的Selecting 事件先执行
      

  5.   

    应该是ObjectDataSource的Selecting 事件先执行,我之前做了一个查询页面,想在第一次用户没有输入查询条件时不查询后台数据,打算在Page_Load里面,结果未成功