GridView 資料異動前的欄位檢查
摘要
一般執行新增/修改完畢準備異動資料庫前,通常會做一層資料正確性檢查的動作;當我們使用 GridView 繫結 SqlDataSoruce 來呈現資料,若 GridView 進行資料編輯存檔前也要做欄位值的檢查應該在如何做呢?應該在那個控制項的那個事件去處理這個檢查動作呢?
程式說明及實作
首先在頁面上放置一個 GridView 及 SqlDataSource 控制項,GridView 設為可編輯狀態。
當 GridView 編輯儲存時,我們要先做一些欄位值正確性的檢查動作,以下的範例為測試示範,只判斷 LastName 欄位不得為空,這種必填欄位的判斷一般只要使用 RequiredFieldValidator 控制項在 Client 端即可。
方法一:在 GridView 的 RowUpdating 事件處理欄位檢查
GridView 在編輯儲存前會引發 RowUpdating 事件,我們可以在此事件中處理欄位檢查,欄位檢查的程式碼如下。當欄位檢查不合法時,設定 e.Cancel = True 即可中斷資料更新的動作。
Protected Sub GridView1_RowUpdating(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewUpdateEventArgs) Handles GridView1.RowUpdating
Dim sScript As String
If String.IsNullOrEmpty(e.NewValues.Item("LastName")) Then
sScript = "alert('LastName 欄位不得為空')"
Me.ClientScript.RegisterStartupScript(Me.GetType, "error", sScript, True)
e.Cancel = True
End If
End Sub
執行程式,故意將 LastName 清空,然後按 [更新] 鈕進行儲存,欄位檢查的動作就被執行了。
方法二:在 SqlDataSource 的 Updating 事件處理欄位檢查
對於 SqlDataSource 來說,編輯資料異動資料庫之前,會引發 SqlDataSource 的 Updating 事件,欄位檢查的程式碼如下。當欄位檢查不合法時,設定 e.Cancel = True 即可中斷資料更新的動作,這種方式的執行結果跟上個作法一樣。
Protected Sub SqlDataSource1_Updating(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.SqlDataSourceCommandEventArgs) Handles SqlDataSource1.Updating
Dim sScript As String
If String.IsNullOrEmpty(e.Command.Parameters("@LastName").Value) Then
sScript = "alert('LastName 欄位不得為空')"
Me.ClientScript.RegisterStartupScript(Me.GetType, "error", sScript, True)
e.Cancel = True
End If
End Sub
結論
以上的說明可以知道在 GridView.RowUpdating 事件及 SqlDataSource.Updating 事件都可以處理欄位檢查,在那個地方處理比較好呢?答案是由資料源頭的 SqlDataSource 控制項來處理會比較好,主要原因如下:
1.儘量不要在 UI 控制項處理資料驗證動作,因為一旦更換其他 UI 控制項(如更換其他廠商開發的 GridView 控制項),程式碼就又要改寫。
2.不同的 UI 控制項繫結 SqlDataSource 控制項,都可以適用相同方法。例如 FormView 及 GridView 不同的 UI 控制項,都可以在 SqlDataSource.Updating 統一處理。
3.如果直接使用 SqlDataSource.Update 方法去執行更新動作,不會引發 UI 控制項的相關事件,但是一樣會引發 SqlDataSource.Updating 事件。