一般要取得 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 指定資料列的欄位值集合。

 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

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

 1     Protected Sub Button1_Click(ByVal sender As ObjectByVal 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


posted on 2007-12-16 11:06  jeff377  阅读(2307)  评论(2编辑  收藏  举报