是否有更好的方法来关闭点击按钮?

时间:2014-10-29 20:04:12

标签: c# button windows-forms-designer

我是初学者并且有一项任务,我必须在其中编制NIM游戏。我从15"代币开始#34;并且在每个转弯处最多可以移除三个,或者隐藏"。到目前为止,我通过执行以下操作隐藏了这些令牌。

private void button1_Click(object sender, EventArgs e)
{
    button1.Visible = false;
}
private void button2_Click(object sender, EventArgs e)
{
    button2.Visible = false;
}

我只是复制并粘贴了多次,并更改了按钮编号,以便我的按钮在点击时关闭。这可能是显而易见的,但有没有更有效的方法来实现这一点,而不是有15个按钮关闭方法?

2 个答案:

答案 0 :(得分:5)

您可以为每个按钮使用相同的点击事件,并使用发件人对象,将其投射到Button

private void buttonsToClose_Click(object sender, EventArgs e)
{
    ((Button)sender).Visible = false;
}

然后只需将该处理程序添加到您想要在单击时关闭的每个按钮。

但请注意,如果您或其他任何人在非InvalidCastException的对象上使用此处理程序,则会抛出Button,所以如果您实际上要使用此代码我会添加某种条件来检查发件人的真实类型。

此外,您可以将任何 Control对象重新使用此内容,方法是将发件人转发给Control,前提是Button继承自Control,并且所有Control个对象都具有Visible属性。这是一个例子,有条件防止无效演员:

private void controlToMakeInvisible_Click(object sender, EventArgs e)
{
    if (sender.GetType() == typeof(Control))
    {
        ((Control)sender).Visible = false;
    }
}

最后一点 - 从您的帖子看来,您可能会对使用Windows窗体中的对象创建事件和连接事件的方式略有误解。如果您进入Designer,请添加一个Click事件,并将其显示在您的Form代码中,如下所示:

private void button1_Click(object sender, EventArgs e)

此方法的名称与其功能无关。 button1_Click的button1部分实际上与Button button1没有任何逻辑关联 - 它只是Designer分配的默认名称。方法button1_ClickButton.Click事件的实际分配将自动生成到Form的Designer.cs方法中。

重点是,如果您复制并粘贴button1_Click并使用button1更改button2的每个事件,请执行以下操作:

private void button2_Click(object sender, EventArgs e) 
{ 
   button2.Visible = false;
}

点击button2时不会触发。实际上,它根本不会发射,因为该方法实际上并未连接到任何控件/事件。

答案 1 :(得分:-1)

只需在foreach循环中调用您的事件。

private void Form1_Load(object sender, EventArgs e)
{
    foreach (var button in Controls.OfType<Button>())
    {
        button.Click += button_Click;
    }
}

void button_Click(object sender, EventArgs e)
{
    ((Control) sender).Visible = false;
}

如果你改变:

Controls.OfType<Button>()

Controls.OfType<Control>()

对于任何Control,它都会将false设置为false。这样你就可以轻松控制你想要引发事件的项目。

OfType摘要:根据指定的类型过滤IEnumerable的元素。