除了按钮之外,如何禁用表单上的所有控件?
我的表单有数百个控件:菜单,面板,分割器,标签,文本框,您可以命名。
除了单个按钮之外,有没有办法禁用每个控件?
按钮之所以重要,是因为我无法使用禁用窗口的方法,因为一个控件仍然需要可用。
您可以执行递归调用以禁用所涉及的所有控件。 然后,您必须启用您的按钮和任何父容器。
private void Form1_Load(object sender, EventArgs e) { DisableControls(this); EnableControls(Button1); } private void DisableControls(Control con) { foreach (Control c in con.Controls) { DisableControls(c); } con.Enabled = false; } private void EnableControls(Control con) { if (con != null) { con.Enabled = true; EnableControls(con.Parent); } }
基于@ pinkfloydx33的答案以及我对其进行的编辑,我创建了一个扩展方法,使其更加简单,只需创建一个这样的public static class
:
public static class GuiExtensionMethods { public static void Enable(this Control con, bool enable) { if (con != null) { foreach (Control c in con.Controls) { c.Enable(enable); } try { con.Invoke((MethodInvoker)(() => con.Enabled = enable)); } catch { } } } }
现在,启用或禁用控件,表单,菜单,子控件等。只需:
this.Enable(true); //Will enable all the controls and sub controls for this form this.Enable(false);//Will disable all the controls and sub controls for this form Button1.Enable(true); //Will enable only the Button1
所以,我会做什么,类似@ pinkfloydx33的答案:
private void Form1_Load(object sender, EventArgs e) { this.Enable(false); Button1.Enable(true); }
我喜欢Extension方法,因为它们是静态的,你可以在任何地方使用它而无需创建实例(手动),至少对我来说它更清晰。
为了更好,更优雅的解决方案,这很容易维护 – 您可能需要重新考虑您的设计,例如将您的按钮放在其他控件旁边。 然后假设其他控件在面板或组框中,只需执行Panel.Enabled = False
。
如果您真的想保留当前的设计,可以将ControlCollection树线性化为Control数组以避免递归,然后执行以下操作:
Array.ForEach(Me.Controls.GetAllControlsOfType(Of Control), Sub(x As Control) x.Enabled = False) yourButton.Enabled = True
- 清除排序说明后如何删除wpf网格排序箭头
- 在双击时,XAML中是否有一种方法可以选择文本框中的所有文本?
- 检查字符串列表中是否存在字符串数组
- 我可以在aspx页面的page_load事件之前调用usercontrol的page_load事件吗?
- WP8 LongListSelector – 重新分配ItemsSource无效
- 这个事件处理程序代码会导致内存泄漏吗?
- 图像在C#中resize – 确定resize尺寸(高度和宽度)的算法
- 字符串连接在C#中不安全,需要使用StringBuilder吗?
- 使用Novell.Directory.Ldap.NETStandard库进行C#netcore ldap身份validation