Creación dinámica de botones y colocación en un orden predefinido usando c #

NET 4.5 C # para crear un formulario de Windows. Quiero crear y agregar botones dinámicamente y también asignarles eventos de clic, pero quiero que se coloquen dinámicamente de una manera particular como la imagen.

enter image description here

Mi pregunta es cómo coloco los botones dinámicamente de la manera anterior, es decir, formato 4×4 (4 botones en una fila, 4 columnas pero filas ilimitadas). ¿Es posible hacerlo en formas de ganar?

Actualmente estoy intentando el código mencionado a continuación, pero no tengo una idea clara de cómo puedo colocar los botones como se muestra arriba.

public Form1() { InitializeComponent(); for (int i = 0; i < 5; i++) { Button button = new Button(); button.Location = new Point(160, 30 * i + 10); button.Click += new EventHandler(ButtonClickCommonEvent); button.Tag = i; this.Controls.Add(button); } } void ButtonClickCommonEvent(object sender, EventArgs e) { Button button = sender as Button; if (button != null) { switch ((int)button.Tag) { case 0: // First Button Clicked break; case 1: // Second Button Clicked break; // ... } } } 

Aconseja la solución con códigos.

Puede usar TableLayoutPanel y crear sus botones dinámicamente y agregarlos al panel.

Por ejemplo:

 private void Form1_Load(object sender, EventArgs e) { var rowCount = 3; var columnCount = 4; this.tableLayoutPanel1.ColumnCount = columnCount; this.tableLayoutPanel1.RowCount = rowCount; this.tableLayoutPanel1.ColumnStyles.Clear(); this.tableLayoutPanel1.RowStyles.Clear(); for (int i = 0; i < columnCount; i++) { this.tableLayoutPanel1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100 / columnCount)); } for (int i = 0; i < rowCount; i++) { this.tableLayoutPanel1.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 100 / rowCount)); } for (int i = 0; i < rowCount* columnCount; i++) { var b = new Button(); b.Text = (i+1).ToString(); b.Name = string.Format("b_{0}", i + 1); b.Click += b_Click; b.Dock = DockStyle.Fill; this.tableLayoutPanel1.Controls.Add(b); } } void b_Click(object sender, EventArgs e) { var b = sender as Button; if (b != null) MessageBox.Show(string.Format("{0} Clicked", b.Text)); } 

enter image description here

Nota:

  • Usando TableLayoutPanel.Controls.Add(control) podemos agregar controles secuencialmente al panel.
  • Usando TableLayoutPanel.Controls.Add(control, columnIndex, rowIndex) podemos agregar controles en celdas específicas.