Passing a particular WebControl type as a parameter in VB.net
-
13-09-2019 - |
Question
I'm trying to create a function that searches up a WebControl's parent-child relationship (basically the opposite of WebControl.FindControl(id as String), but looking for a specific WebControl type).
Example: I have a user control in an ItemTemplate for a GridViewRow. I'm trying to reference the GridViewRow from the user control. The user control may or may not be inside a div or other types of controls, so I don't know exactly how many parent's up to look (i.e. I can't just use userControl.Parent.Parent). I need a function that will find the first GridViewRow that it finds on the way up the parent-child hierarchy.
Thus the need for this function. Unless there's a better way to do this? Anyway, I want to the function I'm creating to be fairly generic, so that different WebControl types (i.e. GridViewRow, Panel, etc.) can be specified depending on what I'm looking for. Here's the code I've written:
Public Function FindParentControlByType(ByRef childControl As WebControl, ByVal parentControlType As WebControl.Type, Optional ByRef levelsUp As Integer = Nothing) As WebControl
Dim parentControl As WebControl = childControl
Dim levelCount = 1
Do While Not parentControl.GetType = parentControlType
If Not levelsUp = Nothing AndAlso levelCount = levelsUp Then
parentControl = Nothing
Exit Do
End If
levelCount += 1
parentControl = parentControl.Parent
Loop
parentControl.FindControl(
Return parentControl
End Function
I know the "ByVal parentControlType as WebControl.Type" in the function definition won't work -- that's what I'm looking for.
I'm sure there's a better way to do this, so please feel free to make me look simple by point it out!
Thanks Guys!
Solution
you should be able to do this easily using recursion. here's an example to get you started or possibly solve your problem.
not exactly that great on VB syntax anymore, but i'm sure you could run this through a converter (like converter.telerik.com)
C# code
public T FindParentControl<T>(
ref WebControl child,
int currentLevel,
int maxLevels)
where T : WebControl
{
if (child.Parent == null || currentLevel > maxLevels)
return null;
if (child.Parent is T)
return child.Parent as T;
else
return FindParentControl<T>(
child.Parent,
currentLevel + 1,
maxLevels);
}
VB.NET Code (by converter.telerik.com)
Public Function FindParentControl(Of T As WebControl)(
ByRef child As WebControl,
currentLevel As Integer,
maxLevels As Integer) As T
If child.Parent = Nothing OrElse currentLevel > maxLevels Then
Return Nothing
End If
If TypeOf child.Parent Is T Then
Return TryCast(child.Parent, T)
Else
Return FindParentControl(Of T)(child.Parent, currentLevel + 1, maxLevels)
End If
End Function