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