2017-10-13 7 views
2

ユーザーが入力する行数と列数に基づいてボタンのグリッドを作成しようとしていますが、グリッドを作成するメソッドが機能しません。私がそれを呼び出すと、グリッドは作成されません。クラスで作成されたメソッドを使用してフォーム上にボタンを作成するにはどうすればよいですか?

このメソッドはTileClassの内部にあり、私はGameBoardフォームで呼び出そうとしています。私はクラスを適切に使用していないような気がします。私はこれがうまくいくと思っているので、私はメソッドを正しく呼び出すとは思わない。

This is what the form looks like

class TileClass : Button 
{ 
    public const int LEFT = 20; 
    public const int WIDTH = 50; 
    public const int HEIGHT = 50; 
    public const int TOP = 50; 
    public const int VGAP = 30; 
    public int x; 
    public int y; 
    public int column; 
    public int row; 
    private int incomingRow; 
    private int incomingColumn; 

    public int IncomingRow { get => incomingRow; set => incomingRow = value; } 
    public int IncomingColumn { get => incomingColumn; set => incomingColumn = value; } 

    public TileClass() 
    { 

    } 
    public void CreateGrid() 
    { 
     x = LEFT; 
     y = TOP; 
     column = IncomingColumn; 
     row = IncomingRow; 

     for (int i = 0; i < row; i++) 
     { 
      for (int j = 0; j < column; j++) 
      { 
       Button b = new Button(); 
       b.Left = x; 
       b.Top = y; 
       b.Width = WIDTH; 
       b.Height = HEIGHT; 
       b.Text = j.ToString(); 

       x += VGAP + HEIGHT; 
       this.Controls.Add(b); 
      } 
     } 
    } 
} 

ゲームボードフォーム

public partial class GameBoard : Form 
{ 
    TileClass tileClass = new TileClass(); 

    public GameBoard() 
    { 
     InitializeComponent(); 
    } 

    private void txtEnter_Click(object sender, EventArgs e) 
    { 

     tileClass.IncomingColumn = int.Parse(txtColumn.Text); 
     tileClass.IncomingRow = int.Parse(txtRow.Text); 
     tileClass.CreateGrid(); 

    } 
+0

「動作しない」とはどういう意味ですか?あなたはボタンクラスから継承する新しいクラスを持っていて、そのメソッドはその中にもっと多くのボタンを作成します。クラスからボタンを継承するべきではありません。パネルやグループボックスなどのコントロールから継承する必要があります。 –

+1

うわー、あなたはこのすべての問題に行き、 'IncomingCollumn'と' IncomingRow'の値を​​解析し、それらをフィールドに渡してからローカル変数に渡します。そしてあなたはそれらで何もしません。あなたの 'for'ループは行と列の数を見なければならないと思いませんか? –

答えて

1

それを実現するためにやるべきことがたくさんがあります:

class TileClass : Panel 
{ 
... 
    public int IncomingRow {get; set;} 
    public int IncomingColumn { get; set; } 
... 
} 

および削除:

private int incomingRow; 
private int incomingColumn; 

ボタンを追加する前にResumeLayoutを使用し、Invalidateを呼び出してGameboardフォームを再描画するのが理想的です。 What does invalidate method do? 注:無効化

public partial class GameBoard : Form 
{ 
    public GameBoard() 
    { 
     InitializeComponent(); 

     tileClass.Dock = DockStyle.Fill; 
     this.Controls.Add(tileClass); 
    } 

    TileClass tileClass = new TileClass(); 

    private void txtEnter_Click(object sender, EventArgs e) 
    { 

     tileClass.IncomingColumn = int.Parse(txtColumn.Text); 
     tileClass.IncomingRow = int.Parse(txtRow.Text); 

     this.ResumeLayout(); //Important 
     tileClass.CreateGrid(); 
     this.Invalidate(); // Important 
    } 
} 

とし、ResumeLayout &なしCOL = 100、行= 100を試してみて、それがこれ以上必要であるように、あなたはより多くのプロパティを設定することができます。

//tileClass.Location = new Point(10, 10); // not sure 
tileClass.Dock = DockStyle.Fill; 
//tileClass.Size = new Size(200, 200); // not sure 

を、代わりに、jの< 5 colとrowを使用する必要があります。

for (int i = 0; i < row; i++) 
{ 
    for (int j = 0; j < column; j++) 
    { 
     Button b = new Button(); 
     b.Left = x; 
     b.Top = y; 
     b.Width = WIDTH; 
     b.Height = HEIGHT; 
     b.Text = string.Format("({0},{1})" , i, j); 

     x += VGAP + HEIGHT; 
     this.Controls.Add(b); 
    } 
    x = LEFT; // not sure, plz calculate! 
    y += Top * (i+1); // not sure, plz calculate! 
} 
+0

ありがとう、働いて^^ – Kris

+0

喜び。あなたが列と行の値を使用する必要があることに注意してください。 –

+0

ああ私はそれを知っています。私はそれを取り除く前にそれらを持っていました。 – Kris

関連する問題