0

私は三目並べプログラムを作成しようとしていますが、ボタンのいずれかがクリックされたかどうか、およびそれがどのボタンであったかをどのように把握するかを知りたいです。現在、すべてのボタン内でコードを繰り返しています。

private void button1_Click(object sender, EventArgs e)
{
  button1.Visible = false;
  label1.Text = "X";
  Application.DoEvents();

}
private void button2_Click(object sender, EventArgs e)
{
  button2.Visible = false;
  label2.Text = "X";
  Application.DoEvents();
}

private void button3_Click(object sender, EventArgs e)
{
   button3.Visible = false;
   label3.Text = "X"
   Application.DoEvents();
}

これを行うよりエレガントな方法はありますか?

4

6 に答える 6

3

あなたが求めているものを達成するには2つの方法があります(WinFormsを想定しています)..

まず、すべてのボタンが同じイベント ハンドラーを指すように接続し、その名前を確認します。

// In the form designer code:
this.buttonNW.Click += new System.EventHandler(this.button_Click);
this.buttonN.Click += new System.EventHandler(this.button_Click);
this.buttonNE.Click += new System.EventHandler(this.button_Click);


// in the form code:
private void button_Click(object sender, EventArgs e) {
    Button thisButton = (Button)sender;

    switch (thisButton.Name) {
        case "buttonNW":
            MessageBox.Show("North West button clicked");
            break;
        case "buttonN":
            MessageBox.Show("Northern button clicked");
            break;
        case "buttonNE":
            MessageBox.Show("North East button clicked");
            break;
    }
}

次に、ロジックを独自の関数に入れ、個々のイベント ハンドラーごとにその関数を呼び出すことができます。

private void buttonNW_Click(object sender, EventArgs e) {
    handleButtonClick("buttonNW");
}

private void buttonN_Click(object sender, EventArgs e) {
    handleButtonClick("buttonN");
}

private void buttonNE_Click(object sender, EventArgs e) {
    handleButtonClick("buttonNE");
}

private void handleButtonClick(string buttonName) {
    switch (buttonName) {
        case "buttonNW":
            MessageBox.Show("North West button clicked");
            break;
        case "buttonN":
            MessageBox.Show("Northern button clicked");
            break;
        case "buttonNE":
            MessageBox.Show("North East button clicked");
            break;
    }
}

すべてが明確になるように、個人的にはオプション2を使用します。

ただし、三目並べゲームでは最大 9 個のボタンしか使用できないことを考えると、これは簡単な作業です。

于 2012-09-30T08:40:29.747 に答える
2

この状況を処理する最も「エレガントな」方法の 1 つは、辞書を使用することです。このアプローチにより、長い switch ステートメントが不要になります。

まず、フォーム デザイナーを使用して、すべてのボタンの Tag プロパティを一意の文字列値に設定します。

button1.Tag = "B1"
button2.Tag = "B2"
button3.Tag = "B3"
button4.Tag = "B4"
....

ボタンクリックイベントハンドラーを同じメソッドに設定します

button1.Click = "button_click"
button2.Click = "button_click"
button3.Click = "button_click"
button4.Click = "button_click"
....

コード ウィンドウで、フォーム内でディクショナリをグローバルに宣言します

private Dictionary<string, Action> buttonActions;

Form_Load イベントでディクショナリを初期化する

buttonActions = new Dictionary<string, Action>();
buttonActions.Add("B1", button1Action);
buttonActions.Add("B2", button2Action);
buttonActions.Add("B3", button3Action);
buttonActions.Add("B4", button4Action);
.....

button_click イベント ハンドラーで、次のコードを記述する必要があります。

private void button_click(object sender, System.EventArgs e)  
{  
    var btnKey = ((Button)sender).Tag.ToString();  
    if(buttonActions.ContainsKey(btnKey))
        buttonActions[btnKey].Invoke();
}

もちろん、ボタン アクションごとに特定のコードを記述する必要があります。

private void button1Action()
{ ... }
private void button2Action()
{ ... }
private void button3Action()
{ ... }
private void button4Action()
{ ... }
于 2012-09-30T08:54:52.020 に答える
1

Asp.Net ではPage_Load、Winforms の同等のものからこれを行うことができます

button1.Click += new EventHandler(MyButtons_Click);
button2.Click += new EventHandler(MyButtons_Click);
button3.Click += new EventHandler(MyButtons_Click);

protected void MyButtons_Click(object sender, EventArgs e)
{
   Button clickedButton = (Button) sender;

   if(clickedButton.Text == "O")
     doThis();

   if(clickedButton.Text == "X")
      doThat();

}
于 2012-09-30T08:40:52.303 に答える
1

Linq to Objectこのゲームのほとんどのプロパティは同じであるため、ボタンを作成してイベントを関連付け、カスタム ロジックを記述するために使用したいと思います。

myFormConstructor()
{    
       //Panel or Container control or collection that is persistant can be used to hold buttons that will be created dynamically i.e. 9 buttons to this panel in our case
       for(int i = 1 ; i <= 9 ; i++)
       {
           var btn = new Button{
                                 Name = "btn"+i.ToString()
                                 Text = i.ToString()
                               });

           btn.Click += new System.EventHandler(listener_button_click);
           pnl.Controls.Add(btn);    
       }
}
///Write common logic for each button using if else
private void listener_button_click(object sender, EventArgs e) 
{

    var btnName = ((Button)sender).Name;
            switch (btnName)
            {
                case "btn1":
                    //handler for btn1 click
                    break;
                case "btn2":
                    //handler for btn2 click
                    break;
            }    
    }

panel.Controls.OfType<Button>().ForEach(編集: ウィンドウ アプリケーションの場合、パネルまたはグループ ボックス内のすべてのボタンを取得してコードを最小限に抑え、クリーンなロジックを記述するために利用できるプロパティがあるため、パネル/グループ ボックスを使用するのが最適なオプションです。さらに、コレクションを持つ必要はありません

于 2012-09-30T09:24:44.797 に答える
0

一般的なクリック ハンドラー メソッド内で、呼び出しボタンの name プロパティを確認できます。

private void ButtonClick(object sender, System.EventArgs e)
{
        var btnName = ((Button)sender).Name;
        switch (btnName)
        {
            case "btn1":
                //handler for btn1 click
                break;
            case "btn2":
                //handler for btn2 click
                break;
        }
}
于 2012-09-30T08:42:55.910 に答える
0

C# では、ASP.NET、WPF、Areo、または WinForm を使用しているかどうかに関係なく。Eventdelegatesを使用します。これをマスターするには、デリゲートに関するチュートリアルとイベントに関するチュートリアルを読む必要があります。

この例は、C# 2.0 と WinForm に基づいています。

最初に、アクションを処理するメソッドを作成する必要があります。

private void hadnleActionForButton(Button button) {

   //Do some magic after button press

}

魔法を行うメソッドがある場合は、イベントを作成してそれを使用するデリゲートを作成する必要があります。または、既存のイベントとデリゲートを使用することもできます。

ボタンのクリック後にアクションが実行されるようにしたい場合

したがって、最初にデリゲートに適合するメソッドを作成します。

private void listener_button_click(object sender, EventArgs e) {

  if(sender is Button) {
    Button b = sender as Button;
    handleActionForButton(b);
  }

}

最後のステップは、イベントをボタンに割り当てることです。これは、オーバーロードされた演算子 += によって行われます

this.button1.Click += new System.EventHandler(listener_button_click);

で、これです。

于 2012-09-30T08:54:35.397 に答える