为什么CausesValidation不会从容器传播到子控件?

时间:2013-10-09 11:16:38

标签: c# winforms validation

我正在使用c#。

为什么CausesValidation属性不会从容器传播到子控件?

我有一个TabControl,我需要在所有选项卡上执行用户输入的验证。 但每个标签都是独立的。我发现如果我有一个像TableLayoutPanel这样的容器并且我将CausesValidation设置为false,那么子组件仍会执行验证。

所以这段代码不起作用:

Foreach(Control c in Container.Controls)
{
    c.CausesValidation = False;
}

如果你做了一些DEBUG输出,你会发现唯一找到的控件是TableLayoutPanel或任何其他容器,如GroupBox,它们将被找到并设置为False。但容器不会将该值传播到子级别。 很多人问我们如何解决问题。我找到了很多方法,但是我创建了一个静态类,允许我在TabControl上选择我想要执行验证的选项卡,并且它会在该TabControl的所有控件上将CausesValidation设置为False,包括带有a的子控件深度为10层。如果你想要那个图书馆只是要求它!

我真正的问题是,容器不应该将该属性传播到其子控件,并且该子控件应该控制到任何子控件吗?!

通过创建一个非常疯狂的代码来节省我们很多工作,这些代码对于应该从头开始工作的东西非常具体?为什么这不暗示?

1 个答案:

答案 0 :(得分:1)

这不是一种处理您的要求的建设性方法。该功能并没有按照您喜欢的方式实现,而且永远不会改变。这不是问题,您可以使用一点代码轻松添加它:

    public static void SetCausesValidation(Control.ControlCollection ctls, bool enable) {
        foreach (Control ctl in ctls) {
            ctl.CausesValidation = enable;
            SetCausesValidation(ctl.Controls, enable);
        }
    }

并在表单构造函数中使用它,例如:

    public Form1() {
        InitializeComponent();
        SetCausesValidation(panel1.Controls, false);
    }

注意在方法中使用递归来通过容器内的整个控件树来设置属性。