16

プログラミングを始めたばかりで、WinForms を使用して複数のボタンを作成し、クリックして白からライム グリーンに変更したり、白に戻したりしたいと考えています。1つのボタンに対してこれを行いました:

private void button1_Click(object sender, EventArgs e)
    {
        if (button1.BackColor != Color.Lime)
        {
            button1.BackColor = Color.Lime;
        }
        else
        {
            button1.BackColor = Color.White;
        }
    }

これで、すべてのボタンに対してそれをコピーして貼り付けることができましたが、それは非効率的であることがわかっています。ボタン2のボタン1を参照するためにwinformsを使用すると、ボタン1の色が変更されます(明らかに)。

では、ヘルパー メソッド、新しいクラス、または何か他のものを使用する必要がありますか? それはどのように見えるでしょうか?

4

7 に答える 7

25

いくつかのアプローチがあります。1 つは、さまざまなボタンが呼び出す共通の関数を作成することです。

private void button1_Click(object sender, EventArgs e)
{
    ChangeColor(button1);
}

private void ChangeColor(Button button)
{
    if (button.BackColor != Color.Lime)
        button.BackColor = Color.Lime;
    else
        button.BackColor = Color.White;
}

その後、各ボタン ハンドラーは同じ関数呼び出しを使用できます。

または、これらすべてのボタンが常にまったく同じことを行う場合は、すべてのボタンに対して 1 つのクリック ハンドラー関数を使用できます。この場合、どのボタンがハンドラーを呼び出したのか (現在はbutton1直接参照しているのに対し)、どのボタンを変更すればよいかを判断する必要があります。senderハンドラー関数に渡されるオブジェクトは、実際にはハンドラーを呼び出したフォーム要素への参照です。あなたがする必要があるのは、それをキャストすることだけです:

private void button_Click(object sender, EventArgs e)
{
    var button = (Button)sender;
    if (button.BackColor != Color.Lime)
        button.BackColor = Color.Lime;
    else
        button.BackColor = Color.White;
}

したがって、最初にハンドラーはそれを呼び出したボタンへの参照を取得し、次にそのボタンでロジックを実行します。ハンドラー関数の名前をもう少し一般的なものにした方法にも注意してください。次に、フォーム デザイナーに移動し、button_Clickこれを呼び出すすべてのボタンのクリック ハンドラーとして設定します。

于 2013-07-19T20:27:44.347 に答える
14

これは、C# クラスの場合とまったく同じ方法で行います。独自のクラスを派生させ、基本クラスの動作をカスタマイズします。すべてのイベントには、オーバーライドできる対応する OnXxxx() メソッドがあります。

プロジェクトに新しいクラスを追加し、次のコードを貼り付けます。

using System;
using System.Windows.Forms;

class MyButton : Button {
    protected override void OnClick(EventArgs e) {
        // Your code here
        //...
        base.OnClick(e);
    }
}

OnClick() のコードを変更して、やりたいことを実行します。コンパイル。ツールボックスの上部に独自のボタン コントロールが表示されます。また、フォームに必要な数のコピーをドロップできます。フォームにコードを追加しなくても、すべて同じように動作します

于 2013-07-19T20:32:10.680 に答える
5

Clickにキャストsenderすることで、イベントを発生させたボタンを取得できますButton

その後、すべてのボタンに同じハンドラーを追加できます。

于 2013-07-19T20:23:06.703 に答える
0

私はVBの男です.... VB.Netでは、イベントに複数のハンドラーを追加し、複数のイベントを同じハンドラーに接続できます。

このサブフックは、すべてのクリックをフックしてボタンに色を付けます。

Private Sub ColorButtons(sender As System.Object, e As System.EventArgs) _
Handles Button1.Click, Button2.Click, ..

コントロールをドラッグ/コピーして新しいコントロールを作成すると、新しいボタンが元のイベントに追加されるため、これを常に誤って行います。

他の Sub は同じイベントを処理して他の作業を行うことができます - 両方が実行されます。

C# でこれを行う方法がわかりません。

于 2013-07-19T22:52:11.047 に答える
0

これを実際に行う適切な方法は、各ボタンのクリック イベントを、その目的のためにコーディングした関数に関連付けることです (ボタンがクリックされたときに関数を実行する必要がありますよね?)。コードの適切なセクション:

MyButton1.Click += new RoutedEventHandler(buttons_Click);
MyButton2.Click += new RoutedEventHandler(buttons_Click);
etc...

好きなだけコントロールをイベント ハンドラーに関連付けることができます。

于 2013-07-20T01:42:28.493 に答える