gpt4 book ai didi

c# - 启用应用按钮的事件

转载 作者:行者123 更新时间:2023-11-30 22:21:01 25 4
gpt4 key购买 nike

我的标准 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com