Public Function GetFirstInvalidControl(container As ContainerControl) As Control
Dim getStyle = GetType(Control).GetMethod("GetStyle", Reflection.BindingFlags.NonPublic Or Reflection.BindingFlags.Instance)
Dim isInvalid = GetType(Control).GetMethod("PerformControlValidation", Reflection.BindingFlags.NonPublic Or Reflection.BindingFlags.Instance)
Dim parents = New Queue(Of Control)
parents.Enqueue(container)
While parents.Any
For Each control As Control In parents.Dequeue.Controls
If CBool(getStyle.Invoke(control, {ControlStyles.Selectable})) AndAlso CBool(isInvalid.Invoke(control, {True})) Then
Return control
End If
parents.Enqueue(control)
Next
End While
Return Nothing
End Function
2条答案
按热度按时间3pmvbmvn1#
唯一的方法似乎是调试Validating事件处理程序(参见Hans对该问题的评论)。
xzlaal3s2#
通过一些Reflection,可以调用.net在ValidateChildren内部调用的相同内部函数。这允许检索每个控件的验证结果,并找到导致问题的那个。我编写了这个小函数以供简单用途: