-1

目前,我的 Winform 上有一些按钮需要根据用户单击的内容在不同点禁用/启用。

我做的第一稿是

button1.Enabled = false;
button2.Enabled = false;

禁用 2 个按钮,这显然是一种可怕的做法,因为目前有很多超过 2 个,而且可能还会有更多,因为这仍在开发中。所以我需要有一种方法可以轻松更改表单上的按钮选择。

然后我想出了这个

private enum Buttons { Button1, Button2 } // etc with all buttons - that are named :)

private void DisableButtons(params Buttons[] buttons)
{
    foreach (Buttons button in buttons)
    {
        switch (button)
        {
            case Buttons.Button1:
                button1.Enabled = false;
                break;
            case Buttons.Button2:
                button2.Enabled = false;
                break;
        }
    }
}

我仍然不太满意。我可以废弃switch-caseandforeach

private void DisableButtons(params Buttons[] buttons)
{
    button1.Enabled = buttons.Contains(Buttons.Button1) ? false : true;
}

对于每个按钮,但我只是认为必须有更好的方法。

关于如何更有效地做到这一点的任何想法?

谢谢

4

2 回答 2

1

我建议您实际上不想创建一个可以灵活启用和禁用任何按钮组合的功能,因为您还不知道您Form将如何工作。当然,这可能会为您节省几行代码,但不会将任何上下文信息传递给下一个维护您的代码的开发人员。它也不会比直接设置控件的状态运行得更快。

我会创建一个函数,当您Form更改状态时调用该函数,该函数采用与您的状态有关的所有可能参数Formswitch然后,我将解码这些参数,并使用传统和if语句在一次传递中按名称显式设置表单上控件的状态。

这个中心功能将使您和未来的开发人员清楚地知道您的状态如何变化以及控件的预期行为方式。它不会以不必要的抽象级别降低代码的性能。

于 2012-07-09T11:40:15.300 回答
1

您可以将最后一行代码缩短为:

button1.Enabled = !buttons.Contains(Buttons.Button1);

替代解决方案

或者您可以使用每个按钮的Tag属性为每个按钮设置一个枚举值。

button1.Tag = Buttons.Button1;
button2.Tag = Buttons.Button2;
button3.Tag = Buttons.Button3;
// etc

你可以对 for 循环中的所有按钮执行此操作:

var buttons = <all buttons, todo>
foreach (var button in buttons) {
    button.Enabled = !button.Contains((Buttons)button.Tag));
}
于 2012-07-09T11:16:20.707 回答