在平时的实际项目中,为了减少往返提交数据,可以一次编辑 gridview 的所有行,这样大大提高用户使用产品的体验。下面就讲解何一次编辑 gridview 的所有数据行。在下面的例子中,数据库使用《asp.net 2.0应用开发技术》一书中site\app_data\下的 aspnet20book.mdb 数据库。例子中的数据更新方式使用 sqldatasource 数据源控件的updatecommand属性,但此方法同样适用于存储过程,sql 语句等。
c#
<%@ page language="c#" debug="true" %>
<!doctype html public "-//w3c//dtd xhtml 1.0 transitional//en" "http://www.w3.org/tr/xhtml1/dtd/xhtml1-transitional.dtd">
<script runat="server">
string[] classnamearray = { "大学", "中学", "高中" };
//初始化原来的值
protected void gridview1_rowdatabound(object sender, gridviewroweventargs e)
{
if (e.row.rowtype == datacontrolrowtype.datarow)
{
system.data.datarowview drv = (system.data.datarowview)e.row.dataitem;
radiobuttonlist rbl = (radiobuttonlist)e.row.findcontrol("txtgender");
if (rbl != null)
{
if ((bool)drv["gender"])
{
rbl.items.findbytext("男").selected = true;
}
else
{
rbl.items.findbytext("女").selected = true;
}
}
dropdownlist ddl = (dropdownlist)e.row.findcontrol("txtclassname");
if (ddl != null)
{
ddl.items.findbytext(drv["classname"].tostring()).selected = true;
}
}
}
// 初始化项目列表
protected void gridview1_rowcreated(object sender, gridviewroweventargs e)
{
if (e.row.rowtype == datacontrolrowtype.datarow)
{
dropdownlist ddl = (dropdownlist)e.row.findcontrol("txtclassname");
ddl.datasource = classnamearray;
ddl.databind();
}
}
//处理提交的数据
protected void xianhuimeng_click(object sender, eventargs e)
{
foreach (gridviewrow gvr in gridview1.rows)
{
string tgender = ((radiobuttonlist)gvr.findcontrol("txtgender")).selectedvalue;
sqldatasource1.updateparameters.add(new parameter("@title", typecode.string, ((textbox)gvr.findcontrol("txttitle")).text));
sqldatasource1.updateparameters.add(new parameter("@gender", typecode.boolean, (tgender == "男" ? "true" : "false")));
sqldatasource1.updateparameters.add(new parameter("@classname",
typecode.string, ((dropdownlist)gvr.findcontrol("txtclassname")).selectedvalue));
sqldatasource1.updateparameters.add(new parameter("@id", typecode.int32, gridview1.datakeys[gvr.dataitemindex].value.tostring()));
sqldatasource1.update();
sqldatasource1.updateparameters.clear();
}
response.redirect(request.urlreferrer.tostring());
}
</script>
<html xmlns="http://www.w3.org/1999/xhtml">
<head id="head1" runat="server">
<title>同时编辑 gridview的 多行</title>
</head>
<body>
<form id="form1" runat="server">
<asp:gridview id="gridview1" runat="server" font-size="12px" cellpadding="3" autogeneratecolumns="false"
datakeynames="id" datasourceid="sqldatasource1" onrowdatabound="gridview1_rowdatabound"
onrowcreated="gridview1_rowcreated">
<headerstyle backcolor="#ededed" />
<columns>
<asp:templatefield headertext="姓名">
<itemtemplate>
<asp:textbox id="txttitle" runat="server" text='<%#eval("title") %>'></asp:textbox>
</itemtemplate>
</asp:templatefield>
<asp:templatefield headertext="性别">
<itemtemplate>
<asp:radiobuttonlist id="txtgender" runat="server" repeatcolumns="2">
<asp:listitem text='男'></asp:listitem>
<asp:listitem text='女'></asp:listitem>
</asp:radiobuttonlist>
</itemtemplate>
</asp:templatefield>
<asp:templatefield headertext="学历">
<itemtemplate>
<asp:dropdownlist id="txtclassname" runat="server">
</asp:dropdownlist>
</itemtemplate>
</asp:templatefield>
</columns>
</asp:gridview>
<asp:sqldatasource id="sqldatasource1" runat="server"
connectionstring="provider=microsoft.jet.oledb.4.0;data source=|datadirectory|\aspnet20book.mdb;persist security info=true"
providername="system.data.oledb" selectcommand="select * from [student]"
updatecommand="update [student] set title = @title,gender = @gender,classname=@classname where id=@id">
</asp:sqldatasource>
<asp:button id="button1" runat="server" text="保存所有修改" onclick="xianhuimeng_click" />
</form>
</body>
</html>
注意:对于sql server 数据库,参数名字不加@。另外注意:不同数据库类型和不同的数据源,updatecommand="update [student] set title = @title,gender = @gender,classname=@classname where id=@id"写法和sqldatasource1.updateparameters.add(new parameter("@title", typecode.string, ((textbox)gvr.findcontrol("txttitle")).text)); 的写法会有所区别。