初学者VB 4x4数独NumericUpDown检查值

时间:2014-04-28 02:07:01

标签: arrays vb.net

我正在创建一个4x4 Sudoku游戏,在加载完全为空时,用户填写数字(1-4)并点击一个确认输入是否有效的按钮。控件必须放在设计器中(不使用代码)。将输入值加载到数组或列表时,有一个更短的方法:

array[0] = nudC1R1
array[1] = nudC2R1 ...

可能是:

for (i=0;i<4;i++)
array[i] = nudc[i]r[x]

我意识到代码是错误的;就在那里,让你们了解我正在寻找的东西。

3 个答案:

答案 0 :(得分:0)

这可以通过reflection实现,虽然比你的例子更加冗长:

Dim name = "nudC" & i & "R" & x
Dim friendFlags = BindingFlags.NonPublic Or BindingFlags.Instance
Dim pi = Me.GetType().GetProperty(name, friendFlags)
Dim control As TextBox = pi.GetValue(Me)
array(i) = Int32.Parse(control.Text)

答案 1 :(得分:0)

我知道你似乎想在循环时使用变量名,但是Phillip Trelford answered需要反射。它也不是特别安全。例如,重命名控件将导致运行时错误而不是编译错误。

相反,最好声明一个控制图

Dim NupControls As New Dictionary(Of Integer, NumericUpDown) 

填写Form_Load()

    Me.NupControls = New Dictionary(Of Integer, NumericUpDown) From
    {{1, Me.nudC2R1 },
     {2, Me.nudC2R1 }, 
     {3, Me.nudC2R1 }, 
     {4, Me.nudC2R1 }}

然后,当你去填充你的数组时,你只需要

For Each i In NupControls.Keys
     array(i) = NupControls(i).Value
Next

或者如果你喜欢Linq

  array = (From n In NupControls
           Order By n.Key
           Select n.Value.Value).ToArray()

或者如果您喜欢Lambda表达式

  array = NupControls.OrderBy(Function(n) n.Key)
                     .Select(Function(n) n.Value.Value).ToArray()

另一种选择当然是将控件绑定到数据结构。这样你就不需要收集值

答案 2 :(得分:0)

另一种方法是在您的自定义&#34; cell&#34;上添加两个属性。控件(可能是文本框),行索引和列索引。然后在Sub New之后InitializeComponent放置自定义代码以枚举所有单元格并构建字典,其中键为rowIndex|colIndex,例如"0|1"。然后,填充你的二维数组,用于计算(我假设你最终会得到的)只是做一个双循环,如下所示:

For i = 0 to 3
  For j = 0 To 3
    Dim key As String = i.ToString() & "|" & j.ToString()
    Dim cell As TextBox 'your custom type should go here instead
    If dict.TryGetValue(key, cell) Then
      array(i,j) = Convert.ToInt32(cell.Text)
    End If
  Next
Next