winforms 找出导致ValidateChildren()失败的控件

xa9qqrwz  于 2023-02-16  发布在  其他
关注(0)|答案(2)|浏览(136)

当我调用myControl.ValidateChildren()时,它返回false。我怎样才能知道,哪个孩子验证失败?
(我是第一次使用WinForms,遇到了一大堆乱七八糟的遗留代码。)

3pmvbmvn

3pmvbmvn1#

唯一的方法似乎是调试Validating事件处理程序(参见Hans对该问题的评论)。

xzlaal3s

xzlaal3s2#

通过一些Reflection,可以调用.net在ValidateChildren内部调用的相同内部函数。这允许检索每个控件的验证结果,并找到导致问题的那个。我编写了这个小函数以供简单用途:

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

相关问题