摘要:遞迴方式的 FindControl
一般 FindControl 函式只能找到第一層子控制項,像 GridView、FormView 之類的複合式控制項,要尋找包含的控制項就非常麻煩,要明確找到父代控制項(容器),才能使用 FindControl 去找到子控制項。而且一旦所有往上的父代控制項有任一層變更,就需要再去修改程式碼。
為解決上述的問題,可以使用遞迴的方式來進行 FindControl 的動作,來簡化尋找控制項的麻煩。請參閱以下的 FindControlEx 函式。
01 ''' <summary>
02 ''' 遞迴尋找指定 ID 的控制項。
03 ''' </summary>
04 ''' <param name="Parent">父代控制項。</param>
05 ''' <param name="ID">欲尋找的控制項識別 ID。</param>
06 ''' <returns>回傳 ID 符合的控制項,若未找到則傳回 Nothing。</returns>
07 Public Function FindControlEx(ByVal Parent As System.Web.UI.Control, ByVal ID As String) As System.Web.UI.Control
08 Dim oCtrl As System.Web.UI.Control = Nothing
09 Dim oChildCtrl As System.Web.UI.Control = Nothing
10
11 '先使用 FindControl 去尋找指定的子控制項
12 oCtrl = Parent.FindControl(ID)
13
14 '若尋找不到則往下層遞迴方式去尋找()
15 If oCtrl Is Nothing Then
16 For Each oChildCtrl In Parent.Controls
17 '以遞迴方式呼叫原函式
18 oCtrl = FindControlEx(oChildCtrl, ID)
19 '若有尋找到指定控制項則離開迴圈
20 If oCtrl IsNot Nothing Then Exit For
21 Next
22 End If
23 Return oCtrl
24 End Function
02 ''' 遞迴尋找指定 ID 的控制項。
03 ''' </summary>
04 ''' <param name="Parent">父代控制項。</param>
05 ''' <param name="ID">欲尋找的控制項識別 ID。</param>
06 ''' <returns>回傳 ID 符合的控制項,若未找到則傳回 Nothing。</returns>
07 Public Function FindControlEx(ByVal Parent As System.Web.UI.Control, ByVal ID As String) As System.Web.UI.Control
08 Dim oCtrl As System.Web.UI.Control = Nothing
09 Dim oChildCtrl As System.Web.UI.Control = Nothing
10
11 '先使用 FindControl 去尋找指定的子控制項
12 oCtrl = Parent.FindControl(ID)
13
14 '若尋找不到則往下層遞迴方式去尋找()
15 If oCtrl Is Nothing Then
16 For Each oChildCtrl In Parent.Controls
17 '以遞迴方式呼叫原函式
18 oCtrl = FindControlEx(oChildCtrl, ID)
19 '若有尋找到指定控制項則離開迴圈
20 If oCtrl IsNot Nothing Then Exit For
21 Next
22 End If
23 Return oCtrl
24 End Function