我有一个winforms应用程序,主(也是唯一)表单有几个按钮。当用户单击按钮时,我希望禁用所有其他按钮。
我知道我可以通过在所有按钮上将“Enabled”设置为false来完成此操作,但是在该按钮的单击事件处理程序中单击了该按钮,但这是一个漫长而乏味的方法。
我在表单上获得了控件集合,但这不包括我的几个按钮:
System.Windows.Forms.Control.ControlCollection ctrls = this.Controls;
如何以可持续的方式实现此功能?
由于
答案 0 :(得分:2)
DisableControls(Control c)
{
c.Enable = false;
foreach(Control child in c.Controls)
DisableControls(child)
}
答案 1 :(得分:1)
private void Form1_Load(object sender, EventArgs e)
{
foreach (Control ctrl in this.Controls)
{
if (ctrl is Button)
{
Button btn = (Button)ctrl;
btn.Click += ButtonClick;
}
}
}
private void ButtonClick(object sender, EventArgs e)
{
foreach (Control ctrl in this.Controls)
{
if (ctrl is Button)
{
Button btn = (Button)ctrl;
if (btn != (Button)sender)
{
btn.Enabled = false;
}
}
}
}
答案 2 :(得分:1)
您可以使用数据绑定,因此您只能在启动时迭代一次:
public partial class Form1 : Form
{
public bool ButtonsEnabled { get; set; }
public Form1()
{
InitializeComponent();
// Enable by default
ButtonsEnabled = true;
// Set the bindings.
FindButtons(this);
}
private void button_Click(object sender, EventArgs e)
{
// Set the bound property
ButtonsEnabled = false;
// Force the buttons to update themselves
this.BindingContext[this].ResumeBinding();
// Renable the clicked button
Button thisButton = sender as Button;
thisButton.Enabled = true;
}
private void FindButtons(Control control)
{
// If the control is a button, bind the Enabled property to ButtonsEnabled
if (control is Button)
{
control.DataBindings.Add("Enabled", this, "ButtonsEnabled");
}
// Check it's children
foreach(Control child in control.Controls)
{
FindButtons(child);
}
}
}
答案 3 :(得分:0)
扩展Alex Reitbort的答案,这是我刚刚在20分钟前为我正在做的这个项目写的一个示例方法:
private void Foo(bool enabled)
{
foreach (Control c in this.Controls)
if (c is Button && c.Tag != null)
c.Enabled = enabled;
}
此函数不递归,就像他的那样。但是,因为我知道除了我的表单之外的容器中没有按钮,所以我不需要担心。如果是子控件(例如GroupBox中的控件),我可能会将该代码修改为这样的代码;
private void ToggleControls()
{
Foo(this.Controls, false) // this being the form, of course.
}
private void Foo(Control.ControlCollection controls, bool enabled)
{
foreach (Control c in controls)
{
if (c is Button && c.Tag != null)
c.Enabled = enabled;
if (c.HasChildren)
Foo(c.Controls, enabled);
}
}
我实际上更喜欢他的方法,那种递归方式看起来比我想象的要清洁一点。只是向您展示另一种方式。
请注意;我的表单上有6个按钮,我只想让其中4个按钮通过此方法修改其Enabled属性。为此,我将Tag属性设置为一些随机字符串。这就是我在if语句中检查c.Tag的原因。如果您知道要禁用每个控件,则可以删除它。