文件代码:
test.aspx
===========================>
<%@ page language="c#" debug="true"%>
<%@import namespace="system.data"%>
<%@ import namespace="system.data.sqlclient" %>
<script language="c#" runat="server">
const string datatablename="employees";
sqlconnection conn;
sqldataadapter adapter;
void page_load(object src, eventargs e)
{
conn=new sqlconnection("server=(local);database=pubs;uid=sa;pwd=");
adapter=new sqldataadapter("select * from employees",conn);
if(!page.ispostback){
binddata();
}
}
//绑定数据
void binddata(){
//先从session中获取datatable
datatable table=(datatable)session[datatablename];
//若session中的datatable不存在,则从数据库获取数据
if(table==null){
table=new datatable();
adapter.fill(table);
//将datatable保存到session中
savetabletosession(table);
table.columns["id"].autoincrement=true;
}
grid.datasource=table;
grid.databind();
}
void changepage(object src,datagridpagechangedeventargs e){
grid.currentpageindex=e.newpageindex;
binddata();
}
void updatedatatable(object src,eventargs e){
try{
datatable table=gettablefromsession();
string name;
byte age;
string address;
checkbox ckdel;
for(int i=0;i<grid.items.count;i++){
datagriditem dgitem=grid.items[i];
int empid=(int)grid.datakeys[dgitem.itemindex];
ckdel=dgitem.findcontrol("delckb") as checkbox;
name=((textbox)dgitem.cells[0].controls[1]).text;
age=byte.parse(((textbox)dgitem.cells[1].controls[1]).text);
address=((textbox)dgitem.cells[2].controls[1]).text;
updateemployee(table,empid,name,age,address,ckdel.checked);
}
savetabletosession(table);
cancelbtn.enabled=true;
int rowcount=0;
foreach(datarow row in table.rows){
if(row.rowstate!=datarowstate.deleted)
rowcount++;
}
if(math.ceiling(rowcount/5.0)==grid.currentpageindex&&grid.currentpageindex>0)
grid.currentpageindex-=1;
binddata();
msglbl.text="更新数据表成功!";
}
catch(exception ex){
msglbl.text="更新数据表失败,出现意外错误:"+ex.message;
}
}
void updateemployee(datatable table,int id,string name,byte age,string address,bool isdelete){
for(int i=0;i<table.rows.count;i++){
datarow row=table.rows[i];
//如果选中了删除复选框,就直接就该行数据删除,不用再更新,否则更新该行数据
if(row!=null&&row.rowstate!=datarowstate.deleted){
if((int)row["id"]==id){
if(!isdelete){
row["name"]=name;
row["age"]=age;
row["address"]=address;
}
else
row.delete();
}
}
}
msglbl.text="更新数据表成功!";
}
void updatedatabase(object src,eventargs e){
try{
datatable table=gettablefromsession();
sqlcommandbuilder cmdbd=new sqlcommandbuilder(adapter);
adapter.update(table);
msglbl.text="更新数据源成功!";
cancelbtn.enabled=false;
}
catch(exception ex){
msglbl.text="更新数据源失败,出现意外错误:"+ex.message;
}
binddata();
}
void cancelupdate(object src,eventargs e){
datatable table=gettablefromsession();
table.rejectchanges();
grid.currentpageindex=0;
binddata();
cancelbtn.enabled=false;
}
void addnewemployee(object src,datagridcommandeventargs e){
if(e.commandname=="add"){
try{
datatable table=gettablefromsession();
string name=((textbox)e.item.findcontrol("newname")).text;
byte age=byte.parse(((textbox)e.item.findcontrol("newage")).text);
string address=((textbox)e.item.findcontrol("newaddress")).text;
datarow row=table.newrow();
row["name"]=name;
row["age"]=age;
row["address"]=address;
table.rows.add(row);
savetabletosession(table);
//重新绑定数据
binddata();
msglbl.text="添加新记录成功!";
cancelbtn.enabled=true;
}
catch(exception ex){
msglbl.text="未能添加新记录,出现意外错误:"+ex.message;
}
}
}
//将datatable保存到session中
void savetabletosession(datatable table){
session[datatablename]=table;
}
//从session中获取datatable
datatable gettablefromsession(){
datatable table=(datatable)session[datatablename];
if(table!=null){
return table;
}
else{
msglbl.text="未能从session中获取数据,可能session已超时,请刷新或重新打开当前页面!";
return null;
}
}
</script>
<html>
<head>
<title> webdiyer制造:)</title>
<meta name="generator" content="editplus">
<meta name="author" content="webdiyer(http://www.webdiyer.com)">
</head>
<body>
<form runat="server">
<asp:datagrid runat="server" id="grid" autogeneratecolumns=false datakeyfield="id" showfooter=true allowpaging=true pagesize=5 onpageindexchanged="changepage" pagerstyle-mode="numericpages" onitemcommand="addnewemployee">
<columns>
<asp:templatecolumn headertext="姓名">
<itemtemplate>
<asp:textbox runat="server" id="name" text=<%#databinder.eval(container.dataitem,"name")%>/>
</itemtemplate>
<footertemplate>
<asp:textbox runat="server" id="newname"/>
</footertemplate>
</asp:templatecolumn>
<asp:templatecolumn headertext="年龄">
<itemtemplate>
<asp:textbox runat="server" id="age" text=<%#databinder.eval(container.dataitem,"age")%>/>
</itemtemplate>
<footertemplate>
<asp:textbox runat="server" id="newage"/>
</footertemplate>
</asp:templatecolumn>
<asp:templatecolumn headertext="住址">
<itemtemplate>
<asp:textbox runat="server" id="address" text=<%#databinder.eval(container.dataitem,"address")%>/>
</itemtemplate>
<footertemplate>
<asp:textbox runat="server" id="newaddress"/>
</footertemplate>
</asp:templatecolumn>
<asp:templatecolumn headertext="删除">
<itemtemplate>
<asp:checkbox runat="server" id="delckb"/>
</itemtemplate>
<footertemplate>
<asp:button runat="server" text="添加" commandname="add"/>
</footertemplate>
</asp:templatecolumn>
</columns>
</asp:datagrid>
<asp:label runat="server" enableviewstate="false" id="msglbl" forecolor="red"/>
<div>
<asp:button runat="server" id="updatebtn" text="更新数据表" onclick="updatedatatable"/>
<asp:button runat="server" id="cancelbtn" text="取消对数据表的更新" enabled=false onclick="cancelupdate"/>
<asp:button runat="server" id="updatedbtbn" text="更新数据源" onclick="updatedatabase"/>
</div>
<div>
说明:datagrid中的数据类型都没有进行验证,如果输入错误的数据类型或空值可能会出错,实际应用中应该对用户输入的数据进行验证!
</div>
</form>
</body>
</html>
数据库中employees表结构:
create table employees (
[id] [int] identity (1, 1) not null ,
[name] [nvarchar] (10) collate chinese_prc_ci_as not null ,
[age] [tinyint] not null ,
[address] [nvarchar] (50) collate chinese_prc_ci_as not null
) on [primary]
go
alter table employees add
constraint [pk_employees] primary key clustered
(
[id]
) on [primary]
go
