遞迴方式的 FindControl (進階版)

遞迴方式的 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)

ASP.NET 魔法學院