-1

我正在尝试使用 vb.net 以 Windows 形式运行代码,其中我有多个带有背景图像和位置等属性的图片框。

所以我想消除这些重复的初始化,因此我试图使用 GetType.Getproperties 命令初始化所有控件。但我收到异常错误

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 等的文本框显式设置属性。

我想在它们的偶数索引中访问这些文本框并执行我的代码。

4

1 回答 1

1

在您发布的代码中执行您尝试执行的操作的正确方法是:

For Each tb In Controls.OfType(Of TextBox)()
    tb.BackColor = Color.Transparent
Next

不要没有充分的理由使用反射。

请注意,将BackColora设置TextBoxTransparent不一定有意义,但您可以在任何类型的控件、任何属性和任何值上使用相同的原则。

如果要使用 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. 它将仅包括其中 a是Name1到 10 范围内的偶数的那些。这是首先确定逻辑的完美示例,即确定代码需要做什么,然后编写代码来专门执行此操作。TextBoxNN

于 2021-09-25T11:54:30.577 回答