当前位置: 首页 > 编程语言 > C#

如何从任意容器中包含控件的窗体中获取所有控件?分享

时间:2023-04-10 22:34:47 C#

如何从任意容器中包含控件的窗体中获取所有控件?例如,我需要一种方法来禁用表单中的所有按钮或验证所有文本框的数据。有任何想法吗?提前致谢!最简单的选项可能是级联:publicstaticvoidSetEnabled(Controlcontrol,boolenabled){control.Enabled=enabled;foreach(control.Controls中的控制子项){SetEnabled(子项,已启用);}}或类似的;您当然可以传递一个委托以使其相当通用:publicstaticvoidApplyAll(Controlcontrol,Actionaction){action(control);foreach(Control.Controls中的控制子项){ApplyAll(child,action);然后是这样的:ApplyAll(this,c=>c.Validate());ApplyAll(this,c=>{c.Enabled=false;});我更喜欢惰性(迭代器)方法来解决问题,所以这就是我使用的方法:///返回控件层次结构中的所有子项。///当一个或多个必需参数为空时抛出。///作为层次结构根的控件。///(可选)要迭代的最大级别数。零将没有///控件,1将只是控件的子项,2将包括///子项的子项。//////一个枚举器,它允许使用foreach来处理迭代此中的所有子级///等级制度。///publicstaticIEnumerableIterateAllChildren(thisControlcontrol,intmaxDepth=int.MaxValue){if(control==null)thrownewArgumentNullException("control");}如果(maxDepth==0)返回新控件[0];返回IterateAllChildrenSafe(控制,1,最大深度);}privatestaticIEnumerableIterateAllChildrenSafe(ControlrootControl,intdepth,intmaxDepth){foreach(ControlcontrolinrootControl.Controls){yieldreturncontrol;//只有当我们不是太深并且我们确实有孩子时才迭代孩子if(depth>=maxDepth||control.Controls.Count==0)continue;varchildren=IterateAllChildrenSafe(control,depth+1,maxDepth);foreach(ControlsubChildControlinchildren){yieldreturnsubChildControl;}}}还试:publicListgetControls(stringwhat,Controlwhere){Listcontroles=newList();foreach(Controlcinwhere.Controls){if(c.GetType().Name==what){controles.Add(c);}否则如果(c.Controls.Count>0){controls.AddRange(getControls(what,c));}}返回控件;}privatevoidForm1_Load(objectsender,EventArgse){varc=getControls("Button",this);我一直在寻找基于类型启用/禁用控件的相同解决方案,所以我想出了类似于Luiscencio的方法(您也可以修改它以获取所有控件或更改其他属性)以上是C#学习教程:如何从任何包含控件形式的容器中获取所有控件?如果分享的内容对你有用,需要进一步了解C#学习教程,希望你多多关注publicstaticvoidsetEnabled(ControlCollectioncntrList,boolenabled,ListtypeList=null){foreach(ControlcntrincntrList){if(cntr.Controls.Count==0)if(typeList!=null){if(typeList.Contains(cntr.GetType()))cntr.Enabled=enabled;}否则cntr.Enabled=enabled;否则setEnabled(cntr.Controls,enabled,typeList);}}publicvoidloadFormEvents(){Listlist=newList();list.Add(typeof(TextBox));setEnabled(frm.Controls,false,list);}收藏不代表立场,如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: