所以,我在 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.
        //
        // ...
    }
}

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

问题是,只要我的控件无效,就永远不会调用该事件处理程序。我有一种感觉,这可能与我的控制层次结构有关,尽管我不是 100% 确定。如果这有帮助,那就是:
-- Parent Form

---- Custom User Control

------ Text Box Control (<-- Causes Hang)

任何想法将不胜感激。

最佳答案

我找到了一个非常简单的解决方案,实际上我很沮丧,因为我浪费了生命中的许多小时来敲击键盘。

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

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

希望这对 future 的人有所帮助。

关于c# - WinForms验证不挂其他控件,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16178436/

10-13 08:19
查看更多