如何(创建和)将组件添加到 Table 布局?

How to (create and) add components to a Table Layout?

我正在 C# 中创建国际象棋游戏。来自 Java-Swing 环境,我创建了一个标准函数,它创建一个 8x8 字段并赋予它基本属性。

     Board = new Label[8, 8];
            for (int i = 0; i < 8; i++)
            {

                for (int j = 0; j < 8; j++)
                {
                    Board[i, j] = new System.Windows.Forms.Label();
                    Board[i, j].Location = new Point(i * 50, j * 50);
                    Board[i, j].Size = new System.Drawing.Size(50, 50);
                    Board[i, j].Visible = true;


                    if ((i + j) % 2 == 0) // Color decision
                    {
                        Board[i, j].BackColor = Color.Black;
                    }

                    else {
                        Board[i, j].BackColor = Color.White;
                    }

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

现在有两个额外的数组,用于保存棋盘外缘的 abc 和 123(以便您可以输入 - "Knight to E3" ).

我已经设法将所有组件添加到屏幕上,但它们目前相互重叠。我正在考虑创建一个 9x9“grid-layout”并向其中添加所有组件。

来自 Java 我习惯了像这样的简单命令:

    GridLayout gl = new Gridlayout(3,3);
    this.setLayout(gl);

然后所有添加的元素都会自动放入网格中。 经过几个小时的研究,我在 C# 中找不到任何类似的东西。使用 TableLayout 只会导致更多的问题而不是解决方案。

我的问题是如何实现 (grid) layout 并将我的所有标签添加到其中? 对于没有发布任何布局代码,我深表歉意,但就像我说的那样,这只是一团糟,没有做任何应该做的事情。

谢谢:)

我想在 Win Forms 中它的工作方式有点不同。 您需要创建一个 TableLayoutPanel,然后访问 TableLayoutPanel.Controls 并通过调用 Control.ControlCollection.Add 方法逐一添加新控件。

var panel = new TableLayoutPanel();
panel.ColumnCount = 3;
panel.RowCount = 4;

for(int i = 0; i< panel.ColumnCount; ++i)
    panel.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F));

for (int i = 0; i < panel.RowCount; ++i)
    panel.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.Percent, 50F));

panel.Dock = DockStyle.Fill;
this.Controls.Add(panel);

for (int c = 0; c < 3; ++c)
{
    for (int r = 0; r < 4; ++r)
    {
        var btn = new Button();
        btn.Text = (c+r).ToString();
        btn.Dock = DockStyle.Fill;
        panel.Controls.Add(btn, c, r);
    }
}

我喜欢创建自己的 class,它继承如下代码所示的表单控件。您可以添加自己的属性,例如 row 和 col,或者使用棋盘添加作为棋子图片的图像。请参阅下面的代码。您可以将下面的代码添加到布局面板,而不是像我那样添加到表单。您可以在板上创建一个 space 来继承一个矩形,然后将图像添加到您的自定义矩形以替换下面的按钮 class。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {

        public Form1()
        {
            InitializeComponent();

            MyButton myButton = new MyButton(this);
        }

    }
    public class MyButton : Button
    {
        public static List<List<MyButton>> board { get; set; }
        public static List<MyButton> buttons { get; set; }
        const int WIDTH = 10;
        const int HEIGTH = 10;
        const int SPACE = 5;
        const int ROWS = 10;
        const int COLS = 20;
        public int row { get; set; }
        public int col { get; set; }

        public MyButton()
        {
        }
        public MyButton(Form1 form1)
        {
            board = new List<List<MyButton>>();
            buttons = new List<MyButton>();

            for (int _row = 0; _row < ROWS; _row++)
            {
                List<MyButton> newRow = new List<MyButton>();
                board.Add(newRow);
                for (int _col = 0; _col < COLS; _col++)
                {
                    MyButton newButton = new MyButton();
                    newButton.row = _row;
                    newButton.col = _col;
                    newButton.Width = WIDTH;
                    newButton.Height = HEIGTH;
                    newButton.Top = _row * (HEIGTH + SPACE);
                    newButton.Left = _col * (WIDTH + SPACE);
                    form1.Controls.Add(newButton);
                    newRow.Add(newButton);
                    buttons.Add(newButton);
                }
            }
        }

    }
}