本文提供一个综合实现GridView 插入、删除、修改的例子,本例子不依赖GridView的内置功能,完全采取自定义的做法,更能符合操作习惯。当然,本例子增加排序、分页的功能也非常简单,因为GridView显示的数据只是当前页的数据,所以,不影响分页。效果如图:完整的源代码:
ASPX 代码 <% @ Page Language = " C# " AutoEventWireup = " true " EnableViewState = " true " %> <% @ Import Namespace = " System.Data " %> <% @ Import Namespace = " System.Data.OleDb " %> < script runat ="server" > private int EditId = 0 ;private String ConnectionString = @ " Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|/ASPNET20Book.mdb; " ; // / <summary> // / 显示图片,在图片不存在时显示一个 none.gif // / </summary> // / <param name="pathPhoto"></param> // / <returns></returns> private string GetUserPhoto(object pathPhoto){ if (pathPhoto == DBNull.Value) { return " <img src='Images/none.gif'> " ; } else { return " <img src=' " + pathPhoto.ToString() + " '> " ; }} // / <summary> // / 数据绑定的处理。在需要编辑时,显示出编辑框 // / </summary> // / <param name="sender"></param> // / <param name="e"></param> protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e){ if (e.Row.RowType == DataControlRowType.DataRow) { if (EditId > 0 ) { // 如果绑定数据源是DatarReader,则使用下面的方法: // System.Data.Common.DbDataRecord rowItem = (System.Data.Common.DbDataRecord)e.Row.DataItem; // 如果绑定是 DataView,则使用此方法 System.Data.DataRowView rowItem = (System.Data.DataRowView)e.Row.DataItem; if (rowItem[ " id " ].ToString().Equals(EditId.ToString())) { // 隐藏显示的文字 PlaceHolder LabelTitle = e.Row.FindControl( " LabelTitle " ) as PlaceHolder; LabelTitle.Visible = false ; PlaceHolder LabelBirthday = e.Row.FindControl( " LabelBirthday " ) as PlaceHolder; LabelBirthday.Visible = false ; PlaceHolder LabelGender = e.Row.FindControl( " LabelGender " ) as PlaceHolder; LabelGender.Visible = false ; PlaceHolder LabelClassName = e.Row.FindControl( " LabelClassName " ) as PlaceHolder; LabelClassName.Visible = false ; PlaceHolder LabelPhoto = e.Row.FindControl( " LabelPhoto " ) as PlaceHolder; LabelPhoto.Visible = false ; // 打开编辑框 TextBox uTitle = e.Row.FindControl( " uTitle " ) as TextBox; uTitle.Visible = true ; TextBox uBirthDay = e.Row.FindControl( " uBirthDay " ) as TextBox; uBirthDay.Visible = true ; RadioButtonList uGender = e.Row.FindControl( " uGender " ) as RadioButtonList; uGender.Visible = true ; DropDownList uClassName = e.Row.FindControl( " uClassName " ) as DropDownList; uClassName.Visible = true ; FileUpload uPhoto = e.Row.FindControl( " uPhoto " ) as FileUpload; uPhoto.Visible = true ; // 赋原来的值 if (rowItem[ " Gender " ] != DBNull.Value) { uGender.SelectedIndex = (Convert.ToBoolean(rowItem[ " Gender " ]) ? 0 : 1 ); } if (rowItem[ " ClassName " ] != DBNull.Value) { uClassName.Items.FindByText(rowItem[ " ClassName " ].ToString()).Selected = true ; } // 显示编辑更新按钮 Panel PanelNormal = e.Row.FindControl( " PanelNormal " ) as Panel; PanelNormal.Visible = false ; Panel PanelUpdate = e.Row.FindControl( " PanelUpdate " ) as Panel; PanelUpdate.Visible = true ; } } }} // / <summary> // / 打开编辑框,将编辑标识传递到 EditId // / </summary> // / <param name="sender"></param> // / <param name="e"></param> protected void EditClick(object sender, EventArgs e){ Button b = sender as Button; EditId = Convert.ToInt32(b.CommandArgument); GridViewRow dvr = b.NamingContainer as GridViewRow; EditId = ( int )GridView1.DataKeys[dvr.DataItemIndex].Value; DataBind(); // Response.Write(GridView1.DataKeys[dvr.DataItemIndex].Value); } // / <summary> // / 将编辑的数据保存 // / </summary> // / <param name="sender"></param> // / <param name="e"></param> protected void UpdateClick(object sender, EventArgs e){ Button b = sender as Button; GridViewRow dvr = b.NamingContainer as GridViewRow; TextBox uTitle = dvr.FindControl( " uTitle " ) as TextBox; string StudentTitle = uTitle.Text; string StudentBirthDay = ((TextBox)dvr.FindControl( " uBirthDay " )).Text; bool StudentGender = ((RadioButtonList)dvr.FindControl( " uGender " )).SelectedValue == " 男 " ? true : false ; string StudentClassName = ((DropDownList)dvr.FindControl( " uClassName " )).SelectedValue; string StudentID = GridView1.DataKeys[dvr.RowIndex].Value.ToString(); string sql = "" ; String PhotoPath = "" ; bool HasFileUploaded = false ; FileUpload oUpload = (FileUpload)dvr.FindControl( " uPhoto " ); if (oUpload.HasFile) { PhotoPath = Guid.NewGuid().ToString( " D " ) + System.IO.Path.GetExtension(oUpload.FileName); oUpload.SaveAs(Server.MapPath( " ~ " ) + " // " + PhotoPath); HasFileUploaded = true ; } if (HasFileUploaded) { sql = " Update Student Set Title=@Title,BirthDay = @BirthDay, " ; sql += " Gender=@Gender,PhotoPath=@PhotoPath,ClassName=@ClassName Where id=@id " ; } else { sql = " Update Student Set Title=@Title,BirthDay = @BirthDay, " ; sql += " Gender=@Gender,ClassName=@ClassName Where id=@id " ; } OleDbConnection cn = new OleDbConnection(ConnectionString); cn.Open(); OleDbCommand cmd = new OleDbCommand(sql, cn); cmd.Parameters.AddWithValue( " @Title " , StudentTitle); cmd.Parameters.AddWithValue( " @BirthDay " , StudentBirthDay); cmd.Parameters.AddWithValue( " @Gender " , StudentGender); if (HasFileUploaded) { cmd.Parameters.AddWithValue( " @PhotoPath " , PhotoPath); } cmd.Parameters.AddWithValue( " @ClassName " , StudentClassName); cmd.Parameters.AddWithValue( " @id " , StudentID); cmd.ExecuteNonQuery(); cn.Close(); Response.Redirect(Request.Url.ToString());} // / <summary> // / 添加新记录 // / </summary> // / <param name="sender"></param> // / <param name="e"></param> protected void AddClick(object sender, EventArgs e){ InsertNewRecord(sender, e);} // / <summary> // / 取消编辑 // / </summary> // / <param name="sender"></param> // / <param name="e"></param> protected void CancelClick(object sender, EventArgs e){ Response.Redirect(Request.UrlReferrer.ToString());} // / <summary> // / 删除记录 // / </summary> // / <param name="sender"></param> // / <param name="e"></param> protected void DeleteClick(object sender, EventArgs e){ Button b = sender as Button; int id = Convert.ToInt32(b.CommandArgument); OleDbConnection cn = new OleDbConnection(ConnectionString); cn.Open(); OleDbCommand cmd = new OleDbCommand( " Delete From [Student] Where [id]=@id " , cn); cmd.Parameters.AddWithValue( " @id " , id); cmd.ExecuteNonQuery(); cn.Close(); Response.Redirect(Request.Url.ToString());} // / <summary> // / 插入新记录的公共函数 // / </summary> // / <param name="sender"></param> // / <param name="e"></param> protected void InsertNewRecord(object sender, EventArgs e){ string StudentTitle = ((TextBox)(sender as Button).NamingContainer.FindControl( " NewTitle " )).Text; if (StudentTitle.Trim() == "" ) { ErrorMsg.Text = " 请输入姓名 " ; return ; } string StudentBirthDay = ((TextBox)(sender as Button).NamingContainer.FindControl( " NewBirthDay " )).Text; bool StudentGender = ((RadioButtonList) (sender as Button).NamingContainer.FindControl( " NewGender " )).SelectedValue == " 男 " ? true : false ; string StudentClassName = ((DropDownList) (sender as Button).NamingContainer.FindControl( " NewClassName " )).SelectedValue; FileUpload oUpload = (FileUpload)(sender as Button).NamingContainer.FindControl( " AddPhoto " ); String FileName = "" ; FileName = Guid.NewGuid().ToString( " D " ) + System.IO.Path.GetExtension(oUpload.FileName); oUpload.SaveAs(Server.MapPath( " ~ " ) + " // " + FileName); string sql = " Insert Into Student (Title,BirthDay,Gender,PhotoPath,ClassName) " ; sql += " Values(@Title,@BirthDay,@Gender,@PhotoPath,@ClassName) " ; OleDbConnection cn = new OleDbConnection(ConnectionString); cn.Open(); OleDbCommand cmd = new OleDbCommand(sql, cn); cmd.Parameters.AddWithValue( " @Title " , StudentTitle); cmd.Parameters.AddWithValue( " @BirthDay " , StudentBirthDay); cmd.Parameters.AddWithValue( " @Gender " , StudentGender); cmd.Parameters.AddWithValue( " @PhotoPath " , FileName); cmd.Parameters.AddWithValue( " @ClassName " , StudentClassName); cmd.ExecuteNonQuery(); cn.Close(); Response.Redirect(Request.FilePath.ToString());} // / <summary> // / 生成 Google 样式的分页 // / </summary> // / <param name="TotalCountRecord"></param> // / <param name="CurrentPage"></param> // / <param name="PageItem"></param> // 每页显示的记录数 private int PageItem = 10 ;private void BuildPagers( int TotalCountRecord, int CurrentPage){ int Step = 6 ; int LeftNum = 0 ; int RightNum = 0 ; String PageUrl = " ? " ; int PageCount = ( int )Math.Ceiling(( double )(TotalCountRecord) / PageItem); if (CurrentPage - Step < 1 ) { LeftNum = 1 ; } else { LeftNum = CurrentPage - Step; } if (CurrentPage + Step > PageCount) { RightNum = PageCount; } else { RightNum = CurrentPage + Step; } string OutPut = "" ; for ( int i = LeftNum; i <= RightNum; i ++ ) { if (i == CurrentPage) { OutPut += " <span style='color:red'> " + i.ToString() + " </span> " ; } else { OutPut += " <a href=/" " + PageUrl + " Page= " + i.ToString() + " /"> " + i.ToString() + " </a> " ; } } if (CurrentPage > 1 ) { OutPut = " <a href=' " + PageUrl + " Page=1'>首页</a> <a href=/" " + PageUrl + " Page= " + (CurrentPage - 1 ) + " /">上一页</a> " + OutPut; } if (CurrentPage < PageCount) { OutPut += " <a href=/" " + PageUrl + " Page= " + (CurrentPage + 1 ) + " /">下一页</a> <a href=' " + PageUrl + " Page= " + PageCount + " '>末页</a> " ; } Pager.InnerHtml = OutPut;} // / <summary> // / 加载页面 // / </summary> // / <param name="sender"></param> // / <param name="e"></param> protected void Page_Load(object sender, EventArgs e){ if ( ! Page.IsPostBack) { DataBind(); }} // / <summary> // / 绑定 GridView // / </summary> protected void DataBind(){ OleDbCommand cmd; String sql; OleDbConnection cn = new OleDbConnection(ConnectionString); cn.Open(); // 由于是 Access 数据库,我们只进行简单的分页。对于性能要求较高的地方,请自行采取其他方法。 sql = " SELECT COUNT(*) FROM [Student] " ; cmd = new OleDbCommand(sql, cn); // 总的记录数 int TotalCount = Convert.ToInt32(cmd.ExecuteScalar()); // 当前页的序号 int PageIndex = 1 ; String page = Request.QueryString[ " Page " ]; if (page == null ) page = " 1 " ; Int32.TryParse(page, out PageIndex); if (PageIndex < 1 ) PageIndex = 1 ; int PageCount = ( int )Math.Ceiling(( double )(TotalCount) / PageItem); if (PageIndex > PageCount) PageIndex = PageCount; int startRecord = (PageIndex - 1 ) * PageItem; sql = " SELECT * FROM [Student] ORDER BY [id] DESC " ; OleDbDataAdapter da = new OleDbDataAdapter(sql, cn); DataSet ds = new DataSet(); da.Fill(ds, startRecord, PageItem, " Student " ); GridView1.DataSource = ds.Tables[ 0 ].DefaultView; GridView1.DataBind(); cn.Close(); BuildPagers(TotalCount, PageIndex);} </ script > <! DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN""http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd" > < 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" AutoGenerateColumns ="False" DataKeyNames ="id" OnRowDataBound ="GridView1_RowDataBound" ShowFooter ="true" > < HeaderStyle BackColor ="#ccff99" Font-Bold ="true" /> < Columns > < asp:TemplateField HeaderText ="姓名" > < ItemTemplate > < asp:PlaceHolder ID ="LabelTitle" runat ="server" > <% # Eval ( " Title " ) %> </ asp:PlaceHolder > < asp:TextBox ID ="uTitle" runat ="server" Text ='<%#Eval("Title") % > ' Visible="false"> </ asp:TextBox > </ ItemTemplate > < FooterTemplate > < asp:TextBox ID ="NewTitle" runat ="server" ></ asp:TextBox > </ FooterTemplate > </ asp:TemplateField > < asp:TemplateField HeaderText ="生日(yyyy-MM-dd格式)" > < ItemTemplate > < asp:PlaceHolder ID ="LabelBirthday" runat ="server" > <% # Eval ( " BirthDay " , " {0:yyyy-MM-dd} " ) %> </ asp:PlaceHolder > < asp:TextBox ID ="uBirthDay" runat ="server" Text ='<%#Eval("BirthDay", "{0:yyyy-MM-dd}")% > ' Visible="false" /> </ ItemTemplate > < FooterTemplate > < asp:TextBox ID ="NewBirthDay" runat ="server" ></ asp:TextBox > </ FooterTemplate > </ asp:TemplateField > < asp:TemplateField HeaderText ="性别" > < ItemTemplate > < asp:PlaceHolder ID ="LabelGender" runat ="server" > <% #( Eval ( " Gender " )).ToString() == " True " ? " 男 " : " 女 " %> </ asp:PlaceHolder > < asp:RadioButtonList ID ="uGender" runat ="server" RepeatDirection ="Horizontal" Visible ="false" > < asp:ListItem Text ="男" ></ asp:ListItem > < asp:ListItem Text ="女" ></ asp:ListItem > </ asp:RadioButtonList > </ ItemTemplate > < FooterTemplate > < asp:RadioButtonList ID ="NewGender" runat ="server" RepeatDirection ="Horizontal" > < asp:ListItem Selected ="true" Text ="男" ></ asp:ListItem > < asp:ListItem Text ="女" ></ asp:ListItem > </ asp:RadioButtonList > </ FooterTemplate > </ asp:TemplateField > < asp:TemplateField HeaderText ="年级" > < ItemTemplate > < asp:PlaceHolder ID ="LabelClassName" runat ="server" > <% # Eval ( " ClassName " ) %> </ asp:PlaceHolder > < asp:DropDownList ID ="uClassName" runat ="server" Visible ="false" > < asp:ListItem Text ="小学" Value ="小学" ></ asp:ListItem > < asp:ListItem Text ="中学" Value ="中学" ></ asp:ListItem > < asp:ListItem Text ="高中" Value ="高中" ></ asp:ListItem > < asp:ListItem Text ="大学" Value ="大学" ></ asp:ListItem > </ asp:DropDownList > </ ItemTemplate > < FooterTemplate > < asp:DropDownList ID ="NewClassName" runat ="server" > < asp:ListItem Text ="小学" Value ="小学" ></ asp:ListItem > < asp:ListItem Text ="中学" Value ="中学" ></ asp:ListItem > < asp:ListItem Text ="高中" Value ="高中" ></ asp:ListItem > < asp:ListItem Text ="大学" Value ="大学" ></ asp:ListItem > </ asp:DropDownList > </ FooterTemplate > </ asp:TemplateField > < asp:TemplateField HeaderText ="照片" > < ItemTemplate > < asp:PlaceHolder ID ="LabelPhoto" runat ="server" > <% # GetUserPhoto( Eval ( " PhotoPath " )) %> </ asp:PlaceHolder > < asp:FileUpload ID ="uPhoto" runat ="server" Visible ="false" /> </ ItemTemplate > < FooterTemplate > < asp:FileUpload ID ="AddPhoto" runat ="server" /> </ FooterTemplate > </ asp:TemplateField > < asp:TemplateField HeaderText ="操作" > < ItemTemplate > < asp:Panel ID ="PanelNormal" runat ="server" > < asp:Button ID ="EditButton" runat ="server" Text ="修改" OnClick ="EditClick" CommandArgument ='<%#Eval("id") % > ' /> < asp:Button ID ="DeleteButton" runat ="server" Text ="删除" OnClick ="DeleteClick" CommandArgument ='<%#Eval("id") % > ' /> </ asp:Panel > < asp:Panel ID ="PanelUpdate" runat ="server" Visible ="false" > < asp:Button ID ="UpdateButton" runat ="server" Text ="更新" OnClick ="UpdateClick" CommandArgument ='<%#Eval("id") % > ' /> < asp:Button ID ="CancelButton" runat ="server" Text ="取消" OnClick ="CancelClick" /> </ asp:Panel > </ ItemTemplate > < FooterTemplate > < asp:Button ID ="AddButton" runat ="server" Text ="添加新纪录" OnClick ="AddClick" /> </ FooterTemplate > </ asp:TemplateField > </ Columns > < EmptyDataTemplate > < table cellspacing ="0" rules ="all" border ="1" style ="border-collapse: collapse;" > < tr > < th > 姓名 </ th > < th > 生日(yyyy-MM-dd格式) </ th > < th > 性别 </ th > < th > 年级 </ th > < th > 照片 </ th > < th > 操作 </ th > </ tr > < tr > < td > < asp:TextBox ID ="NewTitle" runat ="server" ></ asp:TextBox > </ td > < td > < asp:TextBox ID ="NewBirthDay" runat ="server" ></ asp:TextBox > </ td > < td > < asp:RadioButtonList ID ="NewGender" runat ="server" RepeatDirection ="Horizontal" > < asp:ListItem Selected ="true" Text ="男" ></ asp:ListItem > < asp:ListItem Text ="女" ></ asp:ListItem > </ asp:RadioButtonList > </ td > < td > < asp:DropDownList ID ="NewClassName" runat ="server" > < asp:ListItem Text ="小学" Value ="小学" ></ asp:ListItem > < asp:ListItem Text ="中学" Value ="中学" ></ asp:ListItem > < asp:ListItem Text ="高中" Value ="高中" ></ asp:ListItem > < asp:ListItem Text ="大学" Value ="大学" ></ asp:ListItem > </ asp:DropDownList > </ td > < td > < asp:FileUpload ID ="AddPhoto" runat ="server" /> </ td > < td > < asp:Button ID ="b" runat ="server" Text ="添加学生" OnClick ="AddClick" /> </ td > </ tr > </ table > </ EmptyDataTemplate > </ asp:GridView > < div id ="Pager" runat ="server" style ="text-align:left;padding:10px 0;" ></ div > < asp:Label ID ="ErrorMsg" runat ="server" ForeColor ="red" ></ asp:Label > </ form > </ body > </ html >