WinForms验证没有挂其他控件

9ee*_*ee1 3 .net c# winforms .net-4.5

所以,我在WinForms中遇到了这个问题,至少我认为这是一个问题,我无法弄清楚如何解决它.

基本上,当我Validating为控件实现事件处理程序时,我CancelEventArgs.Cancel在控件未通过验证时将其设置为true.示例代码:

private void NameTextBox_Validating(object sender, CancelEventArgs e) {
    // Assume Cool Validation Logic.
    //
    // ...
    var isValid = false;
    if (!isValid) {
        e.Cancel = true;

        // Set an Error Provider Message.
        //
        // ...
    }
}
Run Code Online (Sandbox Code Playgroud)

这会导致整个UI挂起.我无法选择任何其他控件,最小化父窗体窗口,或事件退出父窗体窗口.所以我找到了一个类似的问题,其答案建议FormClosing为父表单实现一个事件处理程序,并FormClosingEventArgs.Cancel在那里设置为false.

问题是,只要我的控件无效,就不会调用该事件处理程序.我觉得它可能与我的控制层次结构有关,尽管我不是100%肯定.如果这有助于它:

-- Parent Form

---- Custom User Control

------ Text Box Control (<-- Causes Hang)
Run Code Online (Sandbox Code Playgroud)

任何想法将不胜感激.

9ee*_*ee1 6

我找到了一个如此简单的解决方案,实际上我感到很沮丧,因此我浪费了很多时间来撞击键盘.

只需将父容器的ContainerControl.AutoValidate属性设置为EnableAllowFocusChange并解决问题.此上下文中的"父容器"表示实际容纳输入控件的容器.

如果您有控件层次结构,则还可以将ContainerControl.AutoValidate属性设置为,Inherit并将最外面的容器设置为EnableAllowFocusChange.

希望这可以帮助将来的某个人.