2D文本框数组导致循环提前退出

本文关键字:循环 退出 文本 数组 2D | 更新日期: 2023-09-27 18:20:16

我找了一段时间,找不到任何能帮助我解决问题的东西,但如果我错过了什么,很抱歉。

所以在学校里,我们必须学习VB并制作游戏,我选择了制作数独。我发现VB很容易理解,所以我决定尝试不同的语言,看看它是否相同。C#是我的选择。我决定重新制作数独游戏,并将其与我的VB游戏进行比较。

在VB代码中,我能够根据以下代码制作一个组成9x9网格的所有文本框的数组:

For Y = 0 to 8
    For X = 0 to 8
    Grid(X, Y) = New Windows.Forms.TextBox
        Pencil(X, Y) = New Windows.Forms.TextBox
        With Grid(X, Y)
            .BackColor = Grid(X, Y).BackColor
            .Name = Asc(97 + X) & Y + 1
            .Location = New System.Drawing.Point(35 + 50 * X + (FindBox(X) - 1) * 15, 50 + 50 * Y + (FindBox(Y) - 1) * 15)
            .Size = New System.Drawing.Size(50, 50)
            .Multiline = True
            .MaxLength = 1
            .Font = New Font(Grid(X, Y).Font.Name, Grid(X, Y).Font.Size + 10)
            .TextAlign = HorizontalAlignment.Center
            .TabIndex = (X + 1) + (Y * 9) + 1
            .BorderStyle = BorderStyle.FixedSingle
        End With
        Me.Controls.Add(Grid(X, Y))
    next
next

这意味着我可以很容易地将数独文本框引用为数组中的网格坐标。我试图在C#中复制这一点,但几乎立刻遇到了问题

public partial class Form1 : Form
{
    TextBox[,] Grid = new TextBox[8,8];
    public Form1()
    {
        InitializeComponent();
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        for (int Y = 0; Y < 9; Y++)
        {
            for (int X = 0; X < 9; X++)
            {
                TextBox TBox = new TextBox();
                Grid[X, Y] = TBox;
                TBox.Location = new Point(50 + X * 100, 50 + Y * 50);
                this.Controls.Add(TBox);
            }
        }
    }

此代码运行,但由于某些原因,它只运行到Y=7,然后停止,不再循环。在我尝试添加任何将文本框链接到数组的内容之前,此代码运行良好(在本例中,Grid[X,Y]=TBox)。我在不使用TBox的情况下尝试过(直接使用数组,但同样的问题仍然存在)。

只是想知道是否有人能启发我,为什么添加"Grid[X,Y]=TBox;"一行会完全破坏嵌套的for循环。

提前谢谢,如果我说得不够/说得太多,我很抱歉。

2D文本框数组导致循环提前退出

在数组的上下文中,C#和VB.NET之间有一个重要的区别。只是一个简单的例子。在C#中,以下数组正好有10个元素,允许的索引从0到9:

int[] array= new int[10];

在VB.NET中,以下数组有11个元素,允许的索引从0到10:

Dim array(10) as Integer

您将代码从VB.NET翻译成C#时没有考虑到这一差异,这就是您出现问题的原因。要解决这个问题,你应该使用:

TextBox[,] Grid = new TextBox[9,9];

代替:

TextBox[,] Grid = new TextBox[8,8];

它不会停止。您得到IndexOutOfRangeException
更改此

new TextBox[8,8]

到这个

new TextBox[9,9]

或者使for循环为"<8"