- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我的标准 winform 上的应用按钮在加载时被禁用,我想启用它,如果任何其他控件的状态发生变化(复选框、单选框、文本框等)
所以我可以浏览每个控件的事件并在那里启用按钮,但我想知道是否有更简单的方法来做到这一点,比如全局事件。
编辑澄清一下:我正在寻找一种我不必对每个控件都做某事的方法。这样我就可以在以后添加更多控件而不必关心它们......
最佳答案
根据您的修改,我修改了我的答案以包含您想要的功能。
首先您需要一个通用的事件处理程序,它看起来应该是这样的:
void MyHandler(object obj, EventArgs e)
{
button1.Enabled = true;
}
其中 button1 是您要启用的按钮。
那么您将需要一个递归方法,不仅要遍历您的 Form.Controls
,还要遍历其中包含的任何容器类型控件。我包括了对一些常见容器控件以及一些基本数据输入控件的处理:
void AddEvents(System.Windows.Forms.Control.ControlCollection Controls)
{
foreach (Control c in Controls)
{
if (c is GroupBox)
{
AddEvents(((GroupBox)c).Controls);
}
else if (c is Panel)
{
AddEvents(((Panel)c).Controls);
}
//Expand this series of if...else... to include any
//other type of container control
else if (c is TextBox)
{
((TextBox)c).TextChanged += new EventHandler(MyHandler);
}
else if (c is RichTextBox)
{
((RichTextBox)c).TextChanged += new EventHandler(MyHandler);
}
else if (c is CheckBox)
{
((CheckBox)c).CheckedChanged += new EventHandler(MyHandler);
}
else if (c is DateTimePicker)
{
((DateTimePicker)c).ValueChanged += new EventHandler(MyHandler);
}
//Expand this to include any other type of controls your form
//has that you need to add the event to
}
}
if else
block 的第一部分检查 control
是否属于包含其他控件的类型。如果是,那么 recursively使用该 control
中包含的新 System.Windows.Forms.Control.ControlCollection
调用 AddEvents 方法。
if else
block 的第二部分检查控制 c 的类型,以便它可以适本地 cast到正确的类型,因此使用正确的事件。如果此时我们能够确定我们的控件类型,则会将之前创建的通用事件添加为处理程序。
最后,你需要调用这个方法。最好的两个地方可能是在您的构造函数中或在 Form.Load
事件中。放置它的最佳位置将取决于您的具体情况。为了简单起见,我选择使用我的构造函数,它现在看起来像这样:
public Form1()
{
InitializeComponent();
AddEvents(this.Controls);
}
这应该是您迭代控件和添加通用事件处理程序所需的全部内容。此代码来 self 创建的一个实际项目,我已经对其进行了测试以确保其功能正常。
编辑:我也刚刚使用 Panel
内的 GroupBox
内的 control
测试了这个> 在 Form
上的 Panel
内的 GroupBox
内。这就是使用递归的用处所在。只要正确设置 if...else...
block ,您就不需要知道确切的嵌套深度。它会根据需要深入,而无需使用嵌套循环并知道确切的深度。
EDIT2:作为旁注,此方法也可以用于更精细的级别。假设您有多个 GroupBox
控件,并且您希望只将事件处理程序添加到“grpBox1”中的控件。您可以调用 AddEvents(grpBox1.Controls)
而不是 AddEvents(this.Controls)
,这只会将事件处理程序应用于 grpBox1
中包含的控件>.
EDIT3: 正如 onemancat 在评论中指出的,实际检查控件是 GroupBox
还是 Panel
并不是完全必要的> 等,因为所有控件都继承自具有 Controls
属性的基类 Control
。您可以通过说 if (c.Controls.Count > 0) AddEvents(c.Controls);
简单地检查 Control
是否包含其他控件;但是,在一种情况下想要选择要迭代的容器控件,则有必要像我在示例中那样检查类型。如果没有必要如此精细,那么检查计数确实更有意义,而不必费心进行类型检查或强制转换。
关于c# - 启用应用按钮的事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14658074/
我想知道如何首先检测 Javascript 是否启用/禁用。在此站点上禁用 javascript 表明 stackoverflow 使用了称为标签的东西。 这是标准的做法吗?它适用于所有浏览器吗?它不
这个问题在这里已经有了答案: 关闭 11 年前。 Possible Duplicate: How to enable PHP short tags ? Enable short open tags
在 VSTS (Azure DevOps) 上拥有私有(private)存储库我尝试通过将以下内容添加到 .csproj 文件来启用 SourceLink:https://github.com/dot
我创建了一个 wx.Frame(我们称之为 mainFrame)。该框架上包含一个按钮,当单击该按钮时,会创建一个新框架(我们称之为 childFrame)。 我想知道如何在创建 childFrame
当我禁用 WPF 中的控件时,比如说一个菜单项 MenuItem aMenuItem = ... aMenuItem.IsEnabled = false; MenuItem 中的文本仍然处于事件状态,
我想在我的 nginx 服务器上启用 gzip 压缩。 nginx.conf 文件在这里: http { # Enable Gzip server { location ~* \.(?
我正在使用免费的 heroku 附加 PG 备份并遵循这些 instructions .我找到了安装应用程序的命令:heroku addons:add pgbackups:auto-week。但是我想
我想知道脚本是否可以使用某种切换按钮启用/禁用页面上的所有输入元素。 我用谷歌搜索了它,但除了这个之外没有发现任何有用的东西: http://www.codetoad.com/javascript/e
在我的 php 文件中,我想使用 jQuery Datepicker。 当我的文件加载时,我创建了禁用的日期选择器。 然后,当我的 php 文件(它是一个表单)中的一个特殊字段被填充时,我想启用日期选
我有一个按钮,如下所示: RadButton lnkAdd = new RadButton(); lnkAdd.ID = "BtnAdd"; lnkAdd.CommandName = RadGrid.
public static void ToggleTaskManager(string keyValue) { RegistryKey objRegistryK
我正在 Azure 中使用事件网格订阅,该订阅在创建 Blob 时触发。然而,我们有很多文件进入这个 blob,比如说 1000 多个。 如果我发现任何文件有任何错误,我想做的是禁用事件订阅。 最佳答
我的网站上有几个使用 HTML5 contentEditable 属性的 div。目标是让用户能够开始编写日记条目,并将保存按钮从禁用更改为启用。 这是我目前拥有的 HTML: Write
我有一个范围输入,其定义如下: @Html.LabelFor(m => Model.Quality, Resources.CompressionQuality) 和一个下拉菜单: @Html.Lab
我正在尝试创建一个启用/禁用按钮的下拉菜单,并且我正在关注此 example 但它已经有 4 年历史了,而且该功能似乎无法在我的 xhtml 页面上运行。 任何帮助都将被适当 最佳答案 这是一个现场演
我正在 Azure 中使用事件网格订阅,该订阅在创建 Blob 时触发。然而,我们有很多文件进入这个 blob,比如说 1000 多个。 如果我发现任何文件有任何错误,我想做的是禁用事件订阅。 最佳答
我在这里遇到一个非常奇怪的情况:我编写了一个应用程序,除其他外,将连接的代理从打开切换到关闭,反之亦然。通过更改注册表中的值来完成此操作: public void SetUpProxy(string
我需要调整一堆 PVC 的大小。似乎最简单的方法是通过ExpandPersistentVolumes 功能。但是我无法获得配置合作。 ExpandPersistentVolumes feature g
如果我的TextField为空,则应禁用该按钮,并且该按钮的textColor和borderColor应该为灰色。但是,启用按钮后,颜色应为蓝色。 更改textColor很容易: button.Set
您好,我的问题是:我无法从另一个类启用表单的按钮。我的表单类是 public class FileSending { //Function for enabling the button
我是一名优秀的程序员,十分优秀!