今日重写全选时,发现IsPostBack相当重要。。。
        
        1.全选CheckBox必须先设置为:
        OnCheckedChanged="chkAll_CheckedChanged" AutoPostBack="True" 

        html端具体为:
        <asp:TemplateField>
                    <ItemTemplate>
                        <asp:CheckBox ID="chk" runat="server" />
                    </ItemTemplate>
                    <FooterTemplate>
                        <asp:CheckBox ID="chkAll" runat="server" Text="全选" OnCheckedChanged="chkAll_CheckedChanged" AutoPostBack="True"/>
                    </FooterTemplate>     
                </asp:TemplateField>

        2.OnCheckedChanged事件:
         protected void chkAll_CheckedChanged(object sender, EventArgs e)
          {

           CheckBox chkBox = (CheckBox)sender;   //sender本身代表了“全选”按钮这个对象
           foreach (GridViewRow gvr in GridView_CC.Rows)
           {
               CheckBox chk = (CheckBox)gvr.FindControl("chk");
               chk.Checked = chkBox.Checked;
           }
          }
         3.上面两方面代码、方法完全正确,但是没有下面这段。。。(没有声音,再好的戏也白搭!)
         protected void Page_Load(object sender, EventArgs e)
          {
              if (!IsPostBack)
              BindData();
          }
         特别前掉红粗体部分,引用SDK解释 :
         Page.IsPostBack 属性
         获取一个值,该值指示该页是否正为响应客户端回发而加载,或者它是否正被首次加载和访问。
         属性值
         如果是为响应客户端回发而加载该页,则为 true;否则为 false。
         
         第一次加载页面IsPostBack为false,所以会进行数据表绑定和页面初始化,当触发AutoPostBack=True后,页面响应客户端回送服务器,这样就不再重新绑定数据表了(应该有利于提高页面执行效率),因为任何输入或构建的数据都已被保留(以视图方式),同时执行相应的OnCheckedChanged事件,如果没有IsPostBack的判断,页面就不断重新绑定数据表和初始化,自然也就执行不到客户端触发的相应事件。

         上网google了下,发现IsPostBack对许多操作影响甚大,例如:在用DataGrid访问和更新数据库时
         
         问题描述:
           用DataGrid访问和更新数据库(SQL Server --Northwind --table name:categories --Query :select categoryID,categoryName,Description form categories ),除了更新操作以外,其它功能OK.对DataGrid进行如下操作:点击“编辑”,相应的行数据变为可编辑,同时编辑按钮被“更新”和“取消”代替。对数据进行编辑,如把Description中的AAA改为BBB。再点“更新”按钮。本意是想用此方法将修改后的数据(BBB)代替数据库中原有的AAA,当然是用Update方法了。但在点“更新”后,数据没有改变,我做过测试,UPDATE方法是有效的,也就是说,UPDATE方法更新的不是新数据,而是没有修改前的旧数据,造成数据没有更新(实际上是更新了)。要注意的是我的Page_Load事件如下
private void Page_Load(object sender, System.EventArgs e)
  {
   // 在此处放置用户代码以初始化页面
   OleAd.Fill(ds);//OleAd--oledbAdapter
   dg.DataBind();//dg--DataGrid
  }

分析问题(个人推测,请指正):
        由于没有用IsPostBack判断是否是第一次加载此页面,所以不管什么情况下只要有PostBack,都会对dg(DataGrid)进行数据绑定。所以在进行任何的sumbit后,dg都会去数据库绑定数据而不理会页面中的数据。
        当对选中的数据进行修改完毕后,在点“更新”时,提交此页面修改的数据,而马上遇到Page_Load事件,不等对修改数据进行处理,服务器就先生成原页面(MS用这种方法提高速度?),发现dg.DataBind(),执行之,于是放弃数据库更新,于是看不到更新结果了。

解决问题:
        解决倒是很简单,Page_Load事件中加上对IsPostBack的判断就可以了。
private void Page_Load(object sender, System.EventArgs e)
  {
   // 在此处放置用户代码以初始化页面
   OleAd.Fill(ds);//OleAd--oledbAdapter
    if(!IsPostBack)
{
   dg.DataBind();//dg--DataGrid
}
  }

posted on 2007-04-18 14:15  林宁  阅读(1804)  评论(3编辑  收藏  举报