今日重写全选时,发现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
}
}