遞迴方式的 FindControl (進階版)
一般 FindControl 方法,大都是以 ID 尋找控制項的第一階的子控制項(若控制項有多載 FindControl 方法則例外)。之前有發表過一篇「遞迴方式的 FindControl」的文章,它是以遞迴方式逐層往下去執行 FindControl,找到指定 ID 的控制項。
此篇文章是提供進階版的 FindControl,此方法一樣是以遞迴方式逐層往下去執行 FindControl,不過它不限只能以 ID 去尋找控制項,而是指定「型別、屬性名稱、屬性值」去尋找符合的控制項。
''' <summary>
''' 遞迴尋找符合條件的控制項。
''' </summary>
''' <param name="Parent">父控制項。</param>
''' <param name="Type">欲尋找的控制項型別。</param>
''' <param name="PropertyName">比對的屬性名稱。</param>
''' <param name="PropertyValue">比對的屬性值。</param>
Public Overloads Shared Function FindControlEx(ByVal Parent As System.Web.UI.Control, ByVal Type As System.Type, _
ByVal PropertyName As String, ByVal PropertyValue As Object) As Object
Dim oControl As System.Web.UI.Control
Dim oFindControl As Object
Dim oValue As Object
For Each oControl In Parent.Controls
If Type.IsInstanceOfType(oControl) Then
'取得屬性值
oValue = GetPropertyValue(oControl, PropertyName)
If oValue.Equals(PropertyValue) Then
Return oControl '型別及屬性值皆符合則回傳此控制項
End If
Else
If oControl.Controls.Count > 0 Then
'遞迴往下尋找符合條件的控制項
oFindControl = FindControlEx(oControl, Type, PropertyName, PropertyValue)
If oFindControl IsNot Nothing Then
Return oFindControl
End If
End If
End If
Next
Return Nothing
End Function
''' <summary>
''' 取得物件的屬性值。
''' </summary>
''' <param name="Component">具有要擷取屬性的物件。</param>
''' <param name="PropertyName">屬性名稱。</param>
Public Shared Function GetPropertyValue(ByVal Component As Object, ByVal PropertyName As String) As Object
Dim Prop As PropertyDescriptor = TypeDescriptor.GetProperties(Component).Item(PropertyName)
Return Prop.GetValue(Component)
End Function
例如我們要尋找 FormView 控制項中一個 CommandName="Insert" 的 LinkButton(ID="FormView1") 控制項,則可以如下呼叫 FindControlEx 方法。
Dim oLinkButton As LinkButton
oLinkButton = CType(FindControlEx(FormView1, GetType(LinkButton), "CommandName", "Insert"), LinkButton)
如果你要尋找的按鈕有可能為 Button、LinkButton、ImageButton任一型別的按鈕,因為這些按鈕都有實作 System.Web.UI.WebControls.IButtonControl 介面,所以也可以利用 IButtonControl 介面去尋找更有彈性。
Dim oButtonControl As IButtonControl
oButtonControl = CType(FindControlEx(FormView1, GetType(IButtonControl), "CommandName", "Insert"), IButtonControl)