我正在尝试创建一个扫雷游戏,但在第一个障碍就摔倒了;创建按钮网格。我有一个 2D 按钮阵列,我正在尝试将按钮添加到 Form1。我最好通过手动对按钮进行编码来做到这一点。但如果有一种方法可以在设计器中创建按钮,然后将它们添加到 2DArray,那么我想这也可以。
所以这基本上是我的问题。如果我在设计器中创建按钮,我不知道如何将它们分配给二维数组。如果我只是手动创建一个二维按钮阵列,我不知道如何将它们添加到窗口中。
这是我到目前为止所得到的。我不知道用什么来代替问号。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace Minesweeper2
{
static class Program
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
Button[,] But = new Button[10, 10];
for (int i = 0; i <= 9; i++)
{
for (int j = 0; j <= 9; j++)
{
But[i, j] = new Button();
????.Add(But[i, j]);
}
}
}
}
}
最佳答案
方法如下:编写 Form1.cs
,而不是 Program.cs
文件!
这里可以这样写:
Button[,] But = new Button[10, 10];
public Form1()
{
InitializeComponent();
Size sz = new Size(30, 30);
for (int i = 0; i <= 9; i++)
{
for (int j = 0; j <= 9; j++)
{
But[i, j] = new Button();
But[i, j].Size = sz;
But[i, j].Location = new Point(sz.Width * i, sz.Height * j);
But[i, j].Click += Buttons_Click;
But[i, j].Tag = new Point(i, j);
this.Controls.Add(But[i, j]);
}
}
}
private void Buttons_Click(object sender, EventArgs e)
{
Button btn = sender as Button;
// ..
}
你可以看到我添加了几行来帮助以后: Tag
包含 i 和 j 数字,你可以在 common 点击事件中取回它们我也创建了 abd 连接:
Point ij = bt.Tag as Point;
创建一个或两个单独的功能,如 Mark 展示的那样也是一个好主意:您只想创建一次按钮,但稍后您会想要为下一轮重置它们。
还值得考虑将它们放在一个容器中,例如 Panel
以帮助进行样式设置和布局。为此,只需将 this
替换为容器控件名称即可!
最后:我对 Minefield 已经不是很熟悉了,所以我不知道每个地雷应该能够存储多少数据。 如果你想用Buttons
存储数据,最好创建一个Mine类
;它将包括坐标、字段状态和可能的邻居数据,也可能包括 Mine 负责的方法。正如我写的那样,一个(即珍贵的)Tag
字段被“浪费”了一个简单的二整数结构..
关于c# - 我如何在 C# 中添加按钮?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39996957/