我在C#中添加了什么按钮?

时间:2016-10-12 11:01:31

标签: c# winforms user-interface multidimensional-array

我正在尝试创造一个扫雷游戏,并在第一个障碍时摔倒了;创建按钮网格。我有一个2D数组按钮,我试图将按钮添加到Form1。我最好通过手动编码按钮来实现这一点。但是如果有一种方法可以在设计器中创建按钮然后将它们添加到2DArray那么我认为这样就可以了。

所以这基本上是我的问题。如果我在设计器中创建按钮,我不知道如何将它们分配给2D数组。如果我只是手动创建一个2D数组按钮,我不知道如何将它们添加到窗口。

这是我到目前为止所得到的。我不知道用什么来代替问号。

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

        }
    }


}

2 个答案:

答案 0 :(得分:2)

在您的代码中,您应该在Form1课程内添加按钮,而不是Program

正如我从这段代码中看到的,它是一个WindowsForms应用程序,所以将你的代码移到 Form1 类。

您可以在Form1类中创建一些函数 PostInitialization()

private void PostInitialization() {
    Button[,] buttons = new Button[10, 10];
    for (int i = 0; i < 10; i++)
    {
        for (int j = 0; j < 10; j++)
        {
            Button button = new Button();
            // change *button* properties here if needed

            buttons[i, j] = button;
            this.Controls.Add(buttons[i, j]);
        }
    }
}

Form1 构造函数中的InitializaComponent函数之后完全调用它。

答案 1 :(得分:2)

以下是如何操作:编码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&amp; j号码,你可以在我创建的常见点击事件中重新获得它们:

  Point ij = bt.Tag as Point;

创建一个或两个单独的功能,如标记显示也是一个好主意:您只想创建一次按钮,但稍后您将需要为下一轮重置它们。

还值得考虑将它们放在容器上,例如Panel以帮助设置样式和布局。为此,只需用容器控件名称替换this

最后:我不再熟悉Minefield了,所以我不知道每个矿应该能存储多少数据。 如果您希望使用Buttons正确存储数据,最好创建Mine class;它将包括坐标,字段状态和可能是邻居数据,也可能是我可以识别的方法。正如我所写的那样,一个(即珍贵的)Tag字段被“浪费”了,只有两个-integer struture ..