0

我正在使用 c#。

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

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

所以这段代码不起作用:

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

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

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

它会为我们节省大量工作,而不是创建一个非常疯狂的代码,该代码非常特定于应该从头开始工作的东西?为什么这不是暗示?

4

1 回答 1

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);
    }

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

于 2013-10-09T12:52:42.680 回答