擷取 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
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
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