2014-08-31 77 views
0

我一直在寻找一段时间,我找不到任何可以帮助我解决问题的东西,但对不起,如果我错过了一些东西。二维文本框数组导致早期循环退出

因此对于学校我们必须学习VB并制作游戏,并且我选择了制作Sudoku。我发现VB易于理解,所以我决定尝试一种不同的语言,看看它是否相同。 C#是我的选择。我决定再次开发Sudoku游戏并将其与我的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;”可以完全毁灭一个嵌套的循环。

在此先感谢,对不起,如果我没有说够多/说得太多。

+0

你是什么意思“停止运行”是什么意思?这是否意味着抛出异常?你能告诉你如何初始化Grid字段/变量吗? – 2014-08-31 08:22:18

+0

对不起,我以为我复制了所有。 我的意思是停止运行它。它不会给我任何错误,它不会第8次运行它,并且不会多次运行第一次for循环。 我做了一个列表框,显示每个迭代的X和Y值,它显示的全部是: (0,0),(1,0),(2,0),(3,0), (4,0),(5,0),(6,0),(7,0)。在那里我好像摆脱了那一行,它继续所有X和Y的值。 – Lolop 2014-08-31 08:31:36

回答

0

它不只是stop.You得到IndexOutOfRangeException
更改此

new TextBox[8,8] 

这个

new TextBox[9,9] 

,或使for循环 “< 8”

+0

谢谢你,先生。我现在觉得很蠢,这个简单的解决方案。这是否意味着Array [9]意味着可以存储9个值? Array(8)意味着它可以存储9个不同的值,而不是Vb的方法。 – Lolop 2014-08-31 08:55:29

+0

不客气,但你应该已经注意到了这个异常。是C#数组不同于VB数组,因为Michal Komorowski说 – 2014-08-31 08:57:35

+0

我只是刚刚阅读了Try Try Catch的,他们是唯一的方法来获取错误在C#(我之前运行我的代码没有得到一个错误)?我认为在编码时他们是一种不必要的建议?我想这只是语言的另一个区别。再次感谢你和米歇尔花时间回答这个问题。 – Lolop 2014-08-31 09:01:29

1

有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]; 
+0

谢谢你的回应。我试图快速浏览编程语言的“基础知识”,这是一个白痴。当我读到C#数组时,我读到他们也从0到最大索引,所以我愚蠢地认为它是以相同的方式声明的。 – Lolop 2014-08-31 08:58:59