在平時的實際項目中,為了減少往返提交數(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ū)別。