为什么原因验证不会从容器传播到子控件
本文关键字:传播 控件 验证 为什么 | 更新日期: 2023-09-27 18:34:38
我正在使用c#。
为什么 CausesValidation 属性不会从容器传播到子控件?
我有一个选项卡控件,我需要对所有选项卡上的用户输入执行验证。但每个选项卡都是独立的。我发现,如果我有一个像 TableLayoutPanel 这样的容器,并且我将 CausesValidation 设置为 false,则子组件仍然执行验证。
所以这段代码不起作用:
Foreach(Control c in Container.Controls)
{
c.CausesValidation = False;
}
如果执行一些 DEBUG 输出,您将看到唯一找到的控件是 TableLayoutPanel 或任何其他容器,如将找到并设置为 False 的 GroupBox。但是容器不会将该值传播到子级别。很多人问我们如何解决这个问题。我找到了很多方法,但是我创建了一个静态类,该类允许我在要执行验证的TabControl上选择选项卡,它将在该TabControl的所有控件上将CausesValidation设置为False,包括深度为10层的子控件。如果你想要那个图书馆,就要求它!
我真正的问题是,容器不应该将该属性传播到其子控件,并将该子控件传播到任何子控件吗?!
这将为我们节省大量工作,而无需创建一个非常疯狂的代码,该代码对于应该从头开始工作的东西非常具体?为什么没有暗示?
这不是处理您的需求的建设性方法。 该功能只是没有按照您希望的方式实现,并且永远不会改变。 这不是问题,您可以使用少量代码轻松添加它:
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);
}
请注意,在方法中使用递归通过容器内的整个控件树设置属性。