一般要取得 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 指定資料列的欄位值集合。
當 TemplateField 的 Button Click 事件中要取得 ProductName 這個欄位值時,就可以利用下面的方式。
例如有一個 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 指定資料列的欄位值集合。
1 ''' <summary>
2 ''' 擷取出 GridView 指定資料列的欄位值集合。
3 ''' </summary>
4 ''' <param name="Columns">欄位集合。</param>
5 ''' <param name="Row">資料列。</param>
6 Private Function ExtractRowValues(ByVal Columns As DataControlFieldCollection, ByVal Row As GridViewRow)
As OrderedDictionary
7 Dim oFieldValues As OrderedDictionary
8 Dim oColumn As DataControlField
9 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
2 ''' 擷取出 GridView 指定資料列的欄位值集合。
3 ''' </summary>
4 ''' <param name="Columns">欄位集合。</param>
5 ''' <param name="Row">資料列。</param>
6 Private Function ExtractRowValues(ByVal Columns As DataControlFieldCollection, ByVal Row As GridViewRow)
As OrderedDictionary
7 Dim oFieldValues As OrderedDictionary
8 Dim oColumn As DataControlField
9 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 這個欄位值時,就可以利用下面的方式。
1 Protected Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs)
2 Dim oRow As GridViewRow
3 Dim oFieldValues As OrderedDictionary
4
5 oRow = CType(CType(sender, Control).BindingContainer, GridViewRow)
6 oFieldValues = ExtractRowValues(GridView1.Columns, oRow)
7
8 '輸出 ProductName 欄位值
9 Me.Response.Write(oFieldValues("ProductName").ToString())
10 End Sub
2 Dim oRow As GridViewRow
3 Dim oFieldValues As OrderedDictionary
4
5 oRow = CType(CType(sender, Control).BindingContainer, GridViewRow)
6 oFieldValues = ExtractRowValues(GridView1.Columns, oRow)
7
8 '輸出 ProductName 欄位值
9 Me.Response.Write(oFieldValues("ProductName").ToString())
10 End Sub