備注:這是我輔導的一個項目開發組的一個例子,用文章的方式分享出來,給更多的朋友參考。其實我們這幾年的項目中,都不怎么使用服務器控件的形式了,而是更多的采用MVC這種開發模式。但是,如果項目的歷史背景是用服務器控件的,也不妨繼續沿用,以免變動太大,對項目的整體開發不利。
很多企業業務程序的頁面,其實本質上都是對數據的操作,諸如增加、刪除、修改和查詢(簡稱:增刪改查),如果有可能在一個頁面中完整地實現(不需要幾個頁面轉來轉去),對於用戶來說可能體驗較好。
ASP.NET在2.0中開始提供多種數據控件,並且采用了模板的機制,使得我們上面的需求變得可能。今天要講的就是號稱ASP.NET中最復雜的控件:GridView的使用。它可以完整實現增刪改查。
頁面:
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="WebApplicationSample.Default" %> <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <title></title> </head> <body> <form id="form1" runat="server"> <div> <asp:GridView ID="gvData" runat="server" OnRowDeleting="gvData_RowDeleting" OnRowUpdating="gvData_RowUpdating" OnRowCancelingEdit="gvData_RowCancelingEdit" OnRowEditing="gvData_RowEditing" AutoGenerateColumns="true" AutoGenerateDeleteButton="true" AutoGenerateEditButton="true"> <%--<Columns> <asp:CommandField HeaderText="操作" UpdateText="保存" CancelText="取消" DeleteText="刪除" ShowDeleteButton="true" ShowEditButton="true" EditText="編輯" /> </Columns>--%> </asp:GridView> <asp:Button ID="btAddNew" runat="server" Text="添加新記錄" OnClick="btAddNew_Click" /> </div> </form> <script> //這里為所有刪除按鈕都處理一個事件,請用戶確認 var links = document.links;//獲取所有的鏈接 for (var i in links) {//循環他們 var a = links[i];//取得當前這個鏈接 if (a.text == "Delete" || a.text=="刪除") {//如果是刪除按鈕的話 var o = a.href;//獲取這個鏈接的地址(默認會生成一個執行javascript的地址的) a.href = "#";//將這個地址刪除掉,就是不要讓他執行默認的行為 a.addEventListener("click", function () {//添加一個新的事件注冊 var result = window.confirm("你是否真的要刪除?");//向用戶確認是否要刪除 if (result == true)//如果用戶確定 eval(o);//執行原先默認的那個方法(去服務器刪除數據) return false; }); } } </script> </body> </html>
代碼:
using System; using System.Collections.Generic; using System.Web.UI.WebControls; namespace WebApplicationSample { /// <summary> /// 這個實例主要演示了如何使用GridView進行數據的增、刪、改、查。 /// 更多有關於該控件的知識,可以參考 http://msdn.microsoft.com/zh-cn/library/vstudio/system.web.ui.webcontrols.gridview.aspx (請仔細閱讀) /// </summary> public partial class Default : System.Web.UI.Page { /// <summary> /// 這是我們定義的一個業務實體類,用來保存界面上的列表數據,為了保存,必須支持序列化 /// </summary> [Serializable] public class Employee { public string FirstName { get; set; } public string LastName { get; set; } } private List<Employee> data = new List<Employee>();//這是用來保存那個列表數據的字段 /// <summary> /// 重寫這個方法來保存視圖狀態。因為每次頁面刷新的時候,默認情況下,data都會被清空,如果希望在多次回發的過程中保存數據,則重寫該方法 /// </summary> /// <returns></returns> protected override object SaveViewState() { var obj = new object[] { base.SaveViewState(), data }; return obj; } /// <summary> /// 重寫該方法,是與上面這個方法配套,在回發回來之后加載並還原 /// </summary> /// <param name="savedState"></param> protected override void LoadViewState(object savedState) { var obj = savedState as object[]; base.LoadViewState(obj[0]); data = obj[1] as List<Employee>; } /// <summary> /// 頁面初始化的時候執行該代碼 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) {//這里只是一個示例,默認給頁面添加一個初始的員工,實際在做的時候,可以不加 data = new List<Employee>(){ new Employee(){FirstName ="ares",LastName ="chen"} }; gvData.DataSource = data; gvData.DataBind(); } } /// <summary> /// 添加新的員工時執行該代碼 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> protected void btAddNew_Click(object sender, EventArgs e) { data.Add(new Employee());//創建一個空的對象 gvData.DataSource = data;//設置數據源 gvData.EditIndex = data.Count - 1;//設置當前這個對象為編輯狀態 gvData.DataBind();//綁定數據 } /// <summary> /// 當用戶決定要刪除某一行數據時執行該代碼 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> protected void gvData_RowDeleting(object sender, GridViewDeleteEventArgs e) { //刪除某一行 data.RemoveAt(e.RowIndex); gvData.DataSource = data; gvData.EditIndex = -1; gvData.DataBind(); } /// <summary> /// 當用戶要保存修改時執行該代碼 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> protected void gvData_RowUpdating(object sender, GridViewUpdateEventArgs e) { var index = e.RowIndex;//獲取當前編輯行當索引號 var row = gvData.Rows[index];//獲取當前用戶編輯的這一行 var firstName = (row.Cells[1].Controls[0] as TextBox).Text;//獲取用戶輸入的數據 var lastName = (row.Cells[2].Controls[0] as TextBox).Text;//獲取用戶輸入的數據 var emp = data[index];//找到這個對象 emp.FirstName = firstName; emp.LastName = lastName; gvData.DataSource = data; gvData.EditIndex = -1;//退出編輯狀態 gvData.DataBind(); } /// <summary> /// 當用戶要取消編輯的時候 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> protected void gvData_RowCancelingEdit(object sender, GridViewCancelEditEventArgs e) { gvData.DataSource = data; gvData.EditIndex = -1; gvData.DataBind(); } /// <summary> /// 當用戶要進行編輯的時候 /// </summary> /// <param name="sender"></param> /// <param name="e"></param> protected void gvData_RowEditing(object sender, GridViewEditEventArgs e) { gvData.DataSource = data; gvData.EditIndex = e.NewEditIndex; gvData.DataBind(); } } }