数独使用 TabIndex 绘制 3*3 正方形

Sudoku draw the 3*3 square using TabIndex

我们目前正在努力完成一项作业。 老师给我们的任务是用文本框制作类似数独的 WFA 应用程序。 我已经突出显示了行和列,但我还需要突出显示子方块。 这是我的代码:

TextBox box = (TextBox)sender; 
        id = box.TabIndex;
        row = Convert.ToInt32(Math.Ceiling(id / 9) * 9);
        min = row - 8;
        col = Convert.ToInt32((id % 9));
        if (col == 0) col = 9;
        col = col + 72;
        tb_clear();         // function to un-highlight the clicked tb
        foreach (TextBox tb in this.Controls)
        {
            if (tb.TabIndex == row)
            {
                tb.BackColor = Color.PowderBlue;
                if (row != min) row--;
            }

            if (tb.TabIndex == col)
            {
                tb.BackColor = Color.PowderBlue;
                col -= 9;
            }

        }
    }

形式如下:

这就是我想要的样子:

谢谢,fusionekk。

您可以将您的数独分成 3x3 个正方形,并在 运行 您的突出显示代码之前手动将每个文本框或 (rowindex, columnindx) 的每个索引元组分配给其中一个。然后突出显示同一方块中的所有文本框。

或者您可以尝试找出一个数学 属性,任何给定正方形的所有索引元组都有共同点,并突出显示共享 属性.

的所有文本框

看看下面的table:

现在假设 i 将是我们的行索引,j 将是我们的列索引。因此,位置 i = 3j = 5 将是

现在仔细看看我们的 table:它被分成 3x3 正方形的扇区,它有六行和六列。

如果我们将行或列索引除以三,我们会得到一个介于 0 和 2 之间的数字(因为我们的最大值 ij 是 6 - 在你的情况下它介于0 和 3,因为你的指数上升到 9)。

在下图中,您可以更好地了解该值如何变化

所以也许你可以做的是获取 SelectedItem 的行 (i) 和列 (j) 的索引并将它们除以 3。

一些例子:

i = 1 & j = 3:

  • i / 3 <= 1,这让我们得到 table;
  • 的顶部
  • j / 3 <= 1,剩下 table;
  • 的左边
  • 合并两个结果,您将得到 table
  • top-left 一侧

i = 4 & j = 4:

  • 1 < i / 3 <= 2,剩下 table;
  • 的底部
  • 1 < j / 3 <= 2,剩下 table;
  • 的右边
  • 合并两个结果,您将得到 table
  • bottom-right 一侧