在平時的實際項目中,為了減少往返提交數(shù)據(jù),可以一次編輯 GridView 的所有行,這樣大大提高用戶使用產(chǎn)品的體驗。下面就講解何一次編輯 GridView 的所有數(shù)據(jù)行。在下面的例子中,數(shù)據(jù)庫使用《ASP.NET 2.0應(yīng)用開發(fā)技術(shù)》一書中Site\App_Data\下的 ASPNET20Book.mdb 數(shù)據(jù)庫。例子中的數(shù)據(jù)更新方式使用 SqlDataSource 數(shù)據(jù)源控件的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?
= ?{? " 大學(xué) " ,? " 中學(xué) " ,? " 高中 " ?};

// 初始化原來的值
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();
??}
}

// 處理提交的數(shù)據(jù)
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 ="學(xué)歷" >
????????
< 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 數(shù)據(jù)庫,參數(shù)名字不加@。另外注意:不同數(shù)據(jù)庫類型和不同的數(shù)據(jù)源,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)); 的寫法會有所區(qū)別。