1

またまた私です、皆さんの邪魔にならないように気をつけましたが、質問があります... ssss... ... ... ...

さて、複数のボタンを持つアプリケーションを作成するときは、通常、すべてのボタンに同じイベント ハンドラーを割り当ててクリック イベントを処理します。私は彼らに一意の名前またはタグを付けてから、switch-case ループを使用して、名前またはタグを使用して、仕事、義務、使命、無効を割り当てます...つまり、これは私のコードでは次のようになります。

    private void button_Click(object sender, EventArgs e)
    {
        Button B = (Button)sender;
        switch (B.Name)
        {
            case "START": optionStart(); break;
            case "LOAD":  optionLoad(); break;
            case "EXIT1": Application.Exit(); break;
            case "EXIT2": backToMainMenu(); break;
        }
    }

ここでいくつかの問題に直面しています。 1. 私の「テクニック」を使用すると、約 20 ~ 30 個のボタンに到達すると、この全体がかなり混乱します。2. 同じ名前のボタンは別の方法で処理する必要があるため、通常は EXIT1、EXIT2、EXIT3 という名前を付けていますが、数回終了すると失われます...

それで、誰かが別の提案や解決策、またはおそらくいくつかのガイドを持っていますか? 私は恥知らずな男です、何でも受け入れます!(冗談です... American Expressは受け付けていません)

4

3 に答える 3

2

辞書を使ってみてはどうですか。実行したいメソッドを登録してから、ハンドラーに登録します。検索して使用するだけです。

例(簡単にするためにエラー処理はありません)-

初期化:

m_clickHandler = new Dictionary<Button, Action>();
m_clickHandler.add(startButton, optionStart);

取り扱い

 private void button_Click(object sender, EventArgs e)
    {
        m_clickHandler[sender as Button].Invoke();
    }

もう 1 つの方法は、ラムダ式を使用することです。イベントを実行したいものに直接フックできます。これにより、ハンドラーが通常取得する醜いパラメーターを節約できます。

button1.Click += (a,b) => Foo();
于 2013-08-04T13:12:28.517 に答える
1

アクションを入力する必要がありますが、これにより保守が容易になる場合があります。

Dictionary<string, Action> actionDict = new Dictionary<string, Action>();
                          {
                             { "START", optionStart},
                             { "LOAD", optionLoad},
                             { "EXIT1", () => { Application.Exit(); }},
                             { "EXIT2", backToMainMenu }
                          };

private void button_Click(object sender, EventArgs e)
{
    Button B = (Button)sender;
    if(B != null)
    {
        Action methodToCall = null;
        if (actionDict.TryGetValue(B.Name, out methodToCall))
        {
            methodToCall();
        } 
    }
}

これで、switch ステートメントを変更しなくても、簡単にディクショナリに追加または削除できます。

または、ボタンのTagプロパティにアクションを保存して呼び出すこともできます。(ただし、コメントで述べたように、これは拡張可能ではありません。リストを追加することはできますが、それは面倒なのでお勧めしません)。

しかし、全体として、なぜこれほど多くの出口オプションがあるのでしょうか? 非常に多くの終了方法に対応するために、画面フローを再設計できるようです。

于 2013-08-04T13:12:42.533 に答える