Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 初学者VB 4x4数独数字上下校验值_Arrays_Vb.net - Fatal编程技术网

Arrays 初学者VB 4x4数独数字上下校验值

Arrays 初学者VB 4x4数独数字上下校验值,arrays,vb.net,Arrays,Vb.net,我正在创建一个4x4数独游戏,加载时完全为空,用户填写数字(1-4),然后点击一个按钮确认输入是否有效。控件必须放置在设计器中(不使用代码)。将输入值加载到数组或列表中时,是否有较短的方法: array[0] = nudC1R1 array[1] = nudC2R1 ... 比如: for (i=0;i<4;i++) array[i] = nudc[i]r[x] for(i=0;i这是可能的,尽管比您的示例要详细一些: Dim name = "nudC" & i & "

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

array[0] = nudC1R1
array[1] = nudC2R1 ...
比如:

for (i=0;i<4;i++)
array[i] = nudc[i]r[x]
for(i=0;i这是可能的,尽管比您的示例要详细一些:

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)

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

相反,最好声明一个控件映射

Dim NupControls As New Dictionary(Of Integer, NumericUpDown) 
填写表格(加载)

之后,当您要填充数组时,只需执行以下操作

For Each i In NupControls.Keys
     array(i) = NupControls(i).Value
Next
或者如果你喜欢林克

  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()

当然,另一种方法是将控件绑定到数据结构。这样您就不需要收集值了。另一种方法是在自定义“单元格”控件(可能是文本框)上有两个属性,行索引和列索引。然后在
子新建中
初始化组件
之后放置自定义代码以枚举所有单元格并构建字典,其中键为
行索引| 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

您是否考虑过将控件放入数组中?事实上,如果您知道游戏是4x4的,您可以在设计时放置控件,并简单地将所需的值存储为数组;您甚至可以构建一个存储数据和相关控件名称或控件引用的数组。@ConradFrix,这将涉及一个几乎相同的集合步骤不是吗?@puropoix将我想要的值存储在数组中,而不是接收到的值(输入)对我没有好处,因为这些值可能不同(1,3,2,4或1,2,3,4)。即使我创建了一个类,类变量也需要分配给数组,对吗?我花了一些时间认真阅读有关反射的内容。虽然我没有使用这种方法,但还是因为头痛:P不,说真的,谢谢你。啊哈!我会试试这个。谢谢。@MrAlex42:如果我的回答有帮助,别忘了接受它。
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