如何(创建和)将组件添加到 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);
}
}
}
}
}
我正在 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);
}
}
}
}
}