datagird 多行外于编辑状态

做了一个示例,用户更新的数据保存在Session中,点击“更新数据源”按钮后将Session中的数据更新到数据库中,可以在 http://www.webdiyer.com/demo/editdatagrid.aspx 看到演示效果:

文件代码:

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 (11) 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 

posted on 2005-03-02 08:29  gwazy  阅读(2372)  评论(6编辑  收藏  举报

导航