如何(创建和)向表格布局添加组件?

时间:2016-04-17 15:32:07

标签: c# winforms layout tablelayout

我正在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'(这样你就可以进入像&#34; Knight to E3&#34; )。

我设法将所有组件添加到屏幕上,但它们目前相互重叠。我在想创建一个9x9&#34; grid-layout&#34;并添加所有组件。

Java我习惯于简单的命令,如:

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

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

我的问题是如何实施(gridlayout并将所有标签添加到其中? 我为了不发布我的任何布局代码而道歉,但就像我说它只是一团糟而且什​​么也不应该。

谢谢:)

2 个答案:

答案 0 :(得分:0)

我猜在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);
    }
}

答案 1 :(得分:0)

我喜欢创建自己的类,继承下面代码的表单控件。您可以添加自己的属性,如行和col,或者使用棋盘添加图像,这是一张图片。见下面的代码。您可以将下面的代码添加到布局面板,而不是像我一样添加到表单。您可以在电路板上创建一个继承矩形的空间,然后将图像添加到自定义矩形中,该矩形将替换下面的按钮类。

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);
                }
            }
        }

    }
}