本文提供一个综合实现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>