2016-10-12 20 views
1

私は掃海艇のゲームを作成しようとしており、最初のハードルに落ちてしまった。ボタンのグリッドを作成します。私は2D配列のボタンを持っており、Form1にボタンを追加しようとしています。私は好ましくは手動でボタンをコーディングすることでこれを行うでしょう。しかし、デザイナーでボタンを作成して2DArrayに追加する方法があれば、うまくいくと思います。C#でボタンを追加するにはどうすればよいですか?

これは本質的に私の問題です。私がデザイナーでボタンを作成すると、2D配列に割り当てる方法がわかりません。手動でボタンの2次元配列を作成するだけの場合は、それらをウィンドウに追加する方法がわかりません。

ここまでは私がこれまでに得たものです。私は疑問符を置き換えるべきか分からない。あなたのコードで

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Threading.Tasks; 
using System.Windows.Forms; 

namespace Minesweeper2 
{ 
    static class Program 
    { 
     /// <summary> 
     /// The main entry point for the application. 
     /// </summary> 
     [STAThread] 
     static void Main() 
     { 
      Application.EnableVisualStyles(); 
      Application.SetCompatibleTextRenderingDefault(false); 
      Application.Run(new Form1()); 


      Button[,] But = new Button[10, 10]; 

      for (int i = 0; i <= 9; i++) 
      { 
       for (int j = 0; j <= 9; j++) 
       { 
        But[i, j] = new Button(); 

        ????.Add(But[i, j]); 
       } 
      } 

     } 
    } 


} 
+0

フォームのコントロールコレクションに追加するには:Controls.Add(But [i、j]); 'また、各ボタンの位置も設定する必要があります。代わりに、TableLayoutPanelを使用して、代わりにそれを追加することもできます。 – TaW

+0

@TaW現在のコンテキストに 'Controls'が存在しないと言われます – Cutter

+1

あなたはProgram.csファイルをコーディングしているようです。代わりにForm.csをコーディングして、InitialzeComponentコールの直後にコンストラクタに移動してください! - 宣言をクラスレベルに移動し、for-loopイントをコンストラクタに移動します。 – TaW

答えて

2

これはどのようにするのですか?ファイルではなく、Form1.csをコードしてください!ここで

はこのように、多分それを書く:

Button[,] But = new Button[10, 10]; 

public Form1() 
{ 
    InitializeComponent(); 

    Size sz = new Size(30, 30); 

    for (int i = 0; i <= 9; i++) 
    { 
     for (int j = 0; j <= 9; j++) 
     { 
      But[i, j] = new Button(); 
      But[i, j].Size = sz; 
      But[i, j].Location = new Point(sz.Width * i, sz.Height * j); 
      But[i, j].Click += Buttons_Click; 
      But[i, j].Tag = new Point(i, j); 

      this.Controls.Add(But[i, j]); 
     } 
    } 

} 

private void Buttons_Click(object sender, EventArgs e) 
{ 
    Button btn = sender as Button; 
    // .. 
} 

あなたは私が後で助けるためにいくつかの行を追加していることがわかります。Tagは私& jの番号が含まれており、共通に戻ってそれらを得ることができますまた、素晴らしいアイデアであるマークを示しよう

Point ij = bt.Tag as Point; 

は、一つまたは二つの別々の機能を作成する:私はABD作成したクリックイベントは、あまりにも、フックアップあなたは一度だけボタンを作成したいのですが、後でラウンドのためにリセットする必要があります。

スタイリングとレイアウトを助けるために、Panelなどのコンテナに配置することも検討する価値があります。このためには、thisをコンテナコントロール名に置き換えてください!

最後に私はもうMinefieldに精通していないので、各鉱山にどれだけのデータを保存できるか分かりません。 のデータをButtonsに保存する場合は、Mine classを作成する方が良いかもしれません。それは座標、フィールド状態、おそらくは近隣データを含んでいて、おそらく私が書いたように、一つの(すなわち貴重な)Tagフィールドは、単純な2整数のストラテジで「無駄」になります。 。

2

、あなたはないProgramで、Form1クラス内のボタンを追加する必要があります。

私はこのコードからわかるように、WindowsFormsアプリケーションですので、Form1クラスにコードを移動してください。

Form1クラスには、PostInitialization()の機能を追加することができます。

private void PostInitialization() { 
    Button[,] buttons = new Button[10, 10]; 
    for (int i = 0; i < 10; i++) 
    { 
     for (int j = 0; j < 10; j++) 
     { 
      Button button = new Button(); 
      // change *button* properties here if needed 

      buttons[i, j] = button; 
      this.Controls.Add(buttons[i, j]); 
     } 
    } 
} 

そして正確にをForm1コンストラクタでInitializaComponent関数の後にそれを呼び出します。

関連する問題