我正在尝试运行代码,在windows的形式使用vb.net,我有多个图片框的属性,如背景和位置。
所以我想消除这些重复的初始化,因此我试图使用GetType初始化所有控件。getproperty命令。但是我得到一个异常错误
Private Sub Read_csv_file_itextbox_Load_1(sender As Object, e As EventArgs) Handles MyBase.Load
For Each c As Control In Me.Controls
If c.GetType().Name = "TextBox" Then
c.GetType().GetProperty("BackColor").SetValue(c, "Transparent", Nothing)
End If
Next
End Sub
我还需要显式地为一些命名为TextBox1,TextBox2, Textbox3等的文本框设置属性。
我想访问这些文本框在他们的偶数索引和执行我的代码。
在你发布的代码中做你想做的事情的正确方法是:
For Each tb In Controls.OfType(Of TextBox)()
tb.BackColor = Color.Transparent
Next
没有充分的理由不要使用反射
注意,将TextBox
的BackColor
设置为Transparent
不一定有意义,但您可以对任何类型的控件、任何属性和任何值使用相同的原则。
如果你想使用LINQ过滤任何列表,那么你调用Where
方法。由您决定要过滤的条件是什么,并编写适当的Boolean
表达式,例如
For Each tb In Controls.OfType(Of TextBox)().
Where(Function(tb) Enumerable.Range(1, 10).
Where(Function(n) n Mod 2 = 0).
Select(Function(n) $"TextBox{n}").
Contains(tb.Name))
tb.BackColor = Color.Transparent
Next
这将首先生成TextBoxes
的列表,然后在Name
上过滤它们。它将只包括Name
为TextBoxN
且N
是1到10范围内的偶数的那些。这是一个首先确定逻辑的完美例子,即计算出代码需要做什么,然后编写代码来专门完成该任务。