2014-01-09 4 views
1

Я новичок в Visual Basic.NET, мне нужно записать кусок кода, чтобы найти самый старший родительский элемент (User Control/Control) в Windows Form.Обнаружение конечного родителя элемента управления в Vb.Net

У меня есть сотни элементов управления на форме Windows, некоторые элементы управления пользователя и некоторые встроенные в Windows, управляет

Код я проверил это добавление нескольких IF условия, но когда элементы управления вложены более 2-х уровней, то его трудно добавить условия IF.

Как: Форма --Panel ---- Группа ------ GroupBox -------- TextBox

'Here is simple code 
'A TextBox inside Panel control 
Dim parent_control As Control = TryCast(txtbox, Control) 'casting that Control in generic Control 
if parent_control.Parent Is Nothing Then 
    Return 
Else 
    Return parent_control.Parent.Parent 
End If 

Я был бы очень благодарен если кто-то поведет меня в этом отношении.

+1

When вы говорите, что вас спрашивали * ... Интересно, действительно ли вам нужно дать ответ. Итак, подсказка: попробуйте рекурсию? –

+0

Сэр, на самом деле функция написания – user3169552

ответ

2

Здесь осуществляется с помощью рекурсии:

#Region "Get Ultimate Parent" 
Private Function GetParentForm(ByVal parent As Control) As Control 
    Dim parent_control As Control = TryCast(parent, Control) 
    '------------------------------------------------------------------------ 
    'Specific to a control means if you want to find only for certain control 
    If TypeOf parent_control Is myControl Then 'myControl is of UserControl 
     Return parent_control 
    End If 
    '------------------------------------------------------------------------ 
    If parent_control.Parent Is Nothing Then 
     Return parent_control 
    End If 
    If parent IsNot Nothing Then 
     Return GetParentForm(parent.Parent) 
    End If 
    Return Nothing 
End Function 
#End Region 

Он работал для меня идеально.

+0

Его работа сейчас. – user3169552

1

конечной будет форма, но вы действительно ищете способ, чтобы проследить до конца, вы можете использовать либо рекурсию или в то время как цикл:

Public Function FindTopMostParent(ctrl As Control) As Control 
    If ctrl.Parent Is Nothing Then 
     Return ctrl '// or nothing? 
    End If 

    Return FindTopMostParent(ctrl.Parent) 
End Function 

Public Function FindTopMostParent_v2(ctrl As Control) As Control 
    Dim output As Control = ctrl 

    While output.Parent IsNot Nothing 
     output = output.Parent 
    End While 

    Return output 
End Function 
+0

Рекс: вещь предельная, очевидно, форма, но в случае UserControl нет формы, поэтому для управления пользователями это будет имя класса. – user3169552

2

нет необходимости рекурсии здесь.

Private Function UltimateParent(ByVal control as Control) As Control 

    Do 
    If Nothing Is control.Parent 
     Return control 
    Else 
     control = control.Parent 
    End If 
    Loop 

End Function 
+0

совершенно правый. – DareDevil

1

* * Вы можете использовать только сделать

Dim Form As System.Windows.Forms.Form 
Form = Combobox.FindForm() 

«, чтобы найти directy родительскую форму любого Controle без каких-либо для до * *

0

простейшими

Public Function GetUltimateParent(ByVal ofThisControl As Control) As Control 
    If ofThisControl Is Nothing return Nothing 'Error Check 

    Dim ultimateParent As Control = ofThisControl 
    While Not ultimateParent.Parent Is Nothing 
     ultimateParent = ultimateParent.Parent 
    End While 

    Return ultimateParent 
End Function 
Смежные вопросы