我正在使用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层。如果你想要那个图书馆只是要求它!
我真正的问题是,容器不应该将该属性传播到其子控件,并且该子控件应该控制到任何子控件吗?!
通过创建一个非常疯狂的代码来节省我们很多工作,这些代码对于应该从头开始工作的东西非常具体?为什么这不暗示?
答案 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);
}
注意在方法中使用递归来通过容器内的整个控件树来设置属性。