我正在创建一个4x4 Sudoku游戏,在加载完全为空时,用户填写数字(1-4)并点击一个确认输入是否有效的按钮。控件必须放在设计器中(不使用代码)。将输入值加载到数组或列表时,有一个更短的方法:
array[0] = nudC1R1
array[1] = nudC2R1 ...
可能是:
for (i=0;i<4;i++)
array[i] = nudc[i]r[x]
我意识到代码是错误的;就在那里,让你们了解我正在寻找的东西。
答案 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