-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-case私はとをスクラップすることができforeachます

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

ボタンごとに、しかし私はただもっと良い方法があるに違いないと思います。

これをより効率的に行う方法について何かアイデアはありますか?

ありがとう

4

2 に答える 2

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 に答える
1

ボタンの組み合わせを柔軟に有効または無効にする機能を実際に作成したくないことをお勧めします。これは、自分Formがどのように機能するかをまだ理解していないためです。確かに、これにより数行のコードを節約できる可能性がありますが、コードを保守する次の開発者にコンテキスト情報を提供することはありません。また、コントロールの状態を直接設定するよりも速く実行されることはありません。

状態が変化するたびに呼び出される単一の関数を作成します。この関数は、Form状態に関連するすべての可能なパラメーターを取りますFormswitch次に、これらのパラメーターをデコードし、従来のステートメントとステートメントを使用して、フォーム上のコントロールの状態を名前で1回のパスで明示的に設定しますif

この中心的な機能により、フォームの状態がどのように変化し、コントロールがどのように動作することが期待されるかが、あなたと将来の開発者に明確になります。不必要なレベルの抽象化でコードのパフォーマンスが低下することはありません。

于 2012-07-09T11:40:15.300 に答える