2016-11-22 9 views
1

ゲームのための簡単なグリッドを作ろうとしています。私はC#とプログラミングの初心者です。ボタンのクリックを制限する方法を教えてもらえますか?グリッドに1つのプレーヤーしか作成しないので、1回クリックした後、ユーザーをより多くのプレーヤーにすることを制限したい。私はあなたの専門家の助けが必要です。1回のクリックでボタンを無効にする

protected void SetClicks() 
    { 
     foreach (Control c in this.panel1.Controls) 
     { 
      if (c is Button) 
      { 
       Button who = c as Button; 
       who.Click += new EventHandler(WhoClicked); 
      } 
     } 
    } 

    protected void MakeButtons() 
    { 
     rowNum = UpDownRow.Text; 
     int nr = Int16.Parse(rowNum);  
     colNum = UpDownColumn.Text; 
     int nc = Int16.Parse(colNum); 
     int btnHeight = panel1.Height/Int16.Parse(rowNum); 
     int btnWidth = panel1.Width/Int16.Parse(colNum); 
     for (int row = 0; row < nr; row++) 
     { 
      for (int column = 0; column < nc; column++) 
      { 
       Button btnNew = new Button(); 
       btnNew.Name = "btn_" + column + "_" + row; 
       btnNew.Height = btnHeight-5; 
       btnNew.Width = btnWidth-5; 
       btnNew.Font = new Font("Arial", 20); 
       // btnNew.Text = theSymbol; 
       btnNew.Image = Properties.Resources.backg; 

       btnNew.Visible = true; 
       // int CenterPoint = panel1.Width/3; 
       btnNew.Location = new Point(10 + (column* btnNew.Width), 10 + (row* btnNew.Height)); 

       //Controls.Add(btnNew); 
       panel1.Controls.Add(btnNew); 

      } 
     } 
    } 



private void button2_Click(object sender, EventArgs e) 
    { 

      picSymbol = Properties.Resources.Player; 

      button2.Enabled = false; 
      // want some help here 

      MessageBox.Show("Too Many Player", "Player number exceed", 
      MessageBoxButtons.OK, MessageBoxIcon.Error); 

    } 
+1

問題をデバッグしましたか? – mybirthname

+0

これは期待どおりに動作するはずです。 – Phiter

+0

最初のクリック後にメッセージボックスが表示される点を除いて、それは問題ありません。メッセージボックスを削除する – bixarrio

答えて

2

私はあなたがそれをしたいと思います:有効として

button2を開始したとします。

private void button2_Click(object sender, EventArgs e) 
{ 

    picSymbol = Properties.Resources.Player; 


    //Will only run if button is disabled, which is after the first player creation. 

     button2.Enabled = false; 
     btn.Text = "Game Disabled"; 


} 

コメントに記載されているとおり、グリッドには多くのボタンがあり、すべて同じイベントでフックされている可能性があります。

この場合、イベントを発生させたボタンであるsenderを使用します。

private void button2_Click(object sender, EventArgs e) 
{ 

    picSymbol = Properties.Resources.Player; 
    Button btn = sender as Button; 

    //Will only run if button is disabled, which is after the first player creation. 
    if (!btn.Enabled){ 
     MessageBox.Show("Too Many Player", "Player number exceed", 
     MessageBoxButtons.OK, MessageBoxIcon.Error); 

     //or 

     btn.Text = "Game Disabled"; 
    } 
    else 
    { 
     btn.Enabled = false; 
    } 

} 
+0

ボタンが無効になっている場合、ボタンはクリックイベントを発生させません。このコードでは、クリックされたボタンのみが無効になります(まだプレーヤーが作成されています)。すべてのボタンでこのイベントが実行されても、まだ問題は解決していません。 – bixarrio

+0

ああ、すべてのボタンをクリックするとすべてのボタンを無効にしますか?またはx個のボタンをクリックした後 – Phiter

+0

それは私のようなものだった。私はこれについて忘れてしまった、申し訳ありませんXD – Phiter

2

ユーザーが2回目に有効なボタンをクリックしたときに、ボタンを無効にするかメッセージボックスを表示するかを選択する必要があります。無効なボタンはユーザーの操作に応答しないため、2回目のクリックに応答できません。

ほとんどのWinFormsユーザーは非常に無効コントロールに使用されている - 何行うことができますことは、ボタンを無効にし、それが無効になっている理由をユーザーが理解できるように、そのText「フルゲーム」に変更しています。

+0

それはまた良いアイデアです。 – Phiter

1

フォーム上の唯一のボタンがグリッド内にある場合は、これを行うことができます。

private void button2_Click(object sender, EventArgs e) 
{ 

    picSymbol = Properties.Resources.Player; 

    foreach (var control in this.Controls) 
    { 
     if (control is Button) 
     { 
      control.Enabled = false; 
     } 
    } 
} 

それはテストされていないが、それはあなたの更新の質問に基づいて

EDIT

を行う必要があり、私はボタン作成での結合イベントを追加し、イベントハンドラを定義しました。

protected void MakeButtons() 
{ 
    rowNum = UpDownRow.Text; 
    int nr = Int16.Parse(rowNum);  
    colNum = UpDownColumn.Text; 
    int nc = Int16.Parse(colNum); 
    int btnHeight = panel1.Height/Int16.Parse(rowNum); 
    int btnWidth = panel1.Width/Int16.Parse(colNum); 
    for (int row = 0; row < nr; row++) 
    { 
     for (int column = 0; column < nc; column++) 
     { 
      Button btnNew = new Button(); 
      btnNew.Name = "btn_" + column + "_" + row; 
      btnNew.Height = btnHeight-5; 
      btnNew.Width = btnWidth-5; 
      btnNew.Font = new Font("Arial", 20); 
      // btnNew.Text = theSymbol; 
      btnNew.Image = Properties.Resources.backg; 

      btnNew.Visible = true; 
      // int CenterPoint = panel1.Width/3; 
      btnNew.Location = new Point(10 + (column* btnNew.Width), 10 + (row* btnNew.Height)); 

      // hook this button to a click event 
      btnNew.Click += new EventHandler(WhoClicked); 

      //Controls.Add(btnNew); 
      panel1.Controls.Add(btnNew); 

     } 
    } 
} 

private void WhoClicked(object sender, EventArgs e) 
{ 

    picSymbol = Properties.Resources.Player; 

    foreach (var control in this.panel1.Controls) 
    { 
     if (control is Button) 
     { 
      control.Enabled = false; 
     } 
    } 
} 
+0

@ bixarrio質問に他のコードを追加しました。見た目を変えて、どこにいらっしゃいましたか教えてください。プレーヤーのボタンをまだ制限できません。 ありがとう –

+0

上記のコードは、あなたの 'WhoClicked'イベントハンドラになければなりません。また、 'this.panel1.Controls'に' this.Controls'(私のコードで)を更新してください。 – bixarrio

関連する問題