2014-08-31 71 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