擷取 GridView 資料列的欄位值集合

擷取 GridView 資料列的欄位值集合

一般要取得 GridView 中的欄位值,都是要指定該欄位值所在的儲存格索引,還要判斷資料列在瀏覽或編輯模式,使用不同的方式在擷取。

例如有一個 ProductName 的 BoundField,它在 GridView 中的欄位索引為 3,則在瀏覽模式要使用下列方式來取得瀏覽時 ProductName 欄位值。

GridViewRow.Cells(3).Text

若是在編輯模式時,因為欄位值是在 Cell 中的 TextBox,所以要使用下列方式來取得編輯時 ProductName 欄位值。

CType(oRow.Cells(3).Controls(0), TextBox).Text

上述擷取 GridView 欄位值的程式碼相當沒有維護性,只要變更欄位序順或變更欄位類型(例如轉成 TemplateField),很容易就讓程式發生錯誤,而且這種錯誤在編譯時期完全無法查覺,只能透過完整測試來發現問題。

為了解決這個問題,比較好的方式是以欄位名稱來取得欄位值。DataControlField 有一個 ExtractValuesFromCell 方法,不論是瀏覽或編輯模式都可以輕易的擷取出 Cell 的欄位值,不用去管它是那一種 DataControlField (BoundField 、 CheckBoxField 或 TemplateField ) 都可以正確的取得欄位值。

下面的 ExtractRowValues 函式就是利用這種方式,擷取出 GridView 指定資料列的欄位值集合。

01     ''' <summary>
02     ''' 擷取出 GridView 指定資料列的欄位值集合。
03     ''' </summary>
04     ''' <param name="Columns">欄位集合。</param>
05     ''' <param name="Row">資料列。</param>
06     Private Function ExtractRowValues(ByVal Columns As DataControlFieldCollection, ByVal Row As GridViewRow) As OrderedDictionary
07         Dim oFieldValues As OrderedDictionary
08         Dim oColumn As DataControlField
09         Dim oDictionary As OrderedDictionary
10         Dim oEntry As DictionaryEntry
11         Dim N1 As Integer
12
13         oFieldValues = New OrderedDictionary(Columns.Count)
14         oDictionary = New OrderedDictionary()
15
16         For N1 = 0 To Columns.Count - 1
17             oColumn = Columns.Item(N1)
18             If oColumn.Visible Then
19                 oDictionary.Clear()
20                 oColumn.ExtractValuesFromCell(oDictionary, TryCast(Row.Cells.Item(N1), DataControlFieldCell), Row.RowState, True)
21                 For Each oEntry In oDictionary
22                     oFieldValues.Item(oEntry.Key) = oEntry.Value
23                 Next
24             End If
25         Next
26
27         Return oFieldValues
28     End Function

當 TemplateField 的 Button 的 Click 事件中要取得 ProductName 這個欄位值時,就可以利用下面的方式。

01     Protected Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs)
02         Dim oRow As GridViewRow
03         Dim oFieldValues As OrderedDictionary
04
05         oRow = CType(CType(sender, Control).BindingContainer, GridViewRow)
06         oFieldValues = ExtractRowValues(GridView1.Columns, oRow)
07
08         '輸出 ProductName 欄位值
09         Me.Response.Write(oFieldValues("ProductName").ToString())
10     End Sub

ASP.NET 魔法學院