【问题标题】:Why do CausesValidation does not propagate from Containers to child controls?为什么 CausesValidation 不会从容器传播到子控件?
【发布时间】:2013-10-09 11:16:38
【问题描述】:

我正在使用 c#。

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

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

所以这段代码行不通:

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

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

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

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

【问题讨论】:

    标签: c# winforms validation


    【解决方案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);
        }
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-12-18
      • 1970-01-01
      • 2016-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多