GetType.Получите свойства для PictureBox

#vb.net #winforms #windows-forms-designer #getproperties

Вопрос:

Я пытаюсь запустить код в форме Windows,используя vb.net где у меня есть несколько ящиков с картинками со свойствами, такими как backgroudimage и местоположение.

Поэтому я хочу устранить эти повторяющиеся инициализации,и поэтому я пытаюсь инициализировать все элементы управления с помощью 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 и так далее.

И я хочу получить доступ к этим текстовым полям в их индексации четных чисел и выполнить свой код.

Комментарии:

1. «Я получаю ошибку исключения» — это не подходящее описание проблемы. Почему в этом коде появляется «Текстовое поле», непонятно. Текстовое поле не поддерживает эффекты прозрачности, как это делает PictureBox. Устраните дубликат кода, создав свой собственный класс из PictureBox, установив свойства в конструкторе.

2. Спасибо вам за поправку. Да , текстовое поле не поддерживает прозрачность. И значение набора(c, цвет. Красный,ничего) не выдает ошибки, и bg изменяется на красный.

Ответ №1:

Правильный способ сделать то, что вы пытаетесь сделать в коде, который вы опубликовали, был бы следующим:

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

Не используйте Отражение без веской причины.

Обратите внимание, что установка значения BackColor a TextBox 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. Это прекрасный пример того, как сначала определяется логика, т. Е. выясняется, что должен делать код, а затем пишется код, специально предназначенный для этого.

Комментарии:

1. @dr.null, это то, что ОП делает в коде, который они опубликовали в вопросе, поэтому я просто согласился с этим. Принцип действует независимо от типа элементов управления, заданного свойства и значения, на которое оно устанавливается.

2. Элемент управления TextBox не поддерживает прозрачность фона, поэтому попытка установить его создает только исключения, независимо от того, используются ли отражения или другие средства. Применяется к другим элементам управления.

3. Спасибо за ваш вклад, теперь я могу изменить цвет фона. Я также ищу, как получить доступ к определенным элементам управления текстовыми полями в группе элементов управления текстовыми полями. Например, У меня есть 10 элементов управления текстовым полем, и я хочу отредактировать фон элемента управления текстовым полем, который содержит четное число в качестве заголовка (TextBox2,TextBox4,TextBox6,TextBox8,TextBox10) и другой цвет для нечетной нумерации текстовых полей (TextBox1,TextBox3,TextBox5,TextBox7,TextBox9). Как я могу получить доступ к индексации? Жду с нетерпением. Заранее спасибо

4. @SindhuHalesh, OfType метод фильтрует по типу, и вы можете использовать Where метод, который можно использовать для фильтрации по любым другим критериям, например Controls.OfType(Of TextBox)().Where(Function(tb) Enumerable.Range(11, 10).Select(Function(n) $"TextBox{n}").Contains(tb.Name)) , вы получите все TextBoxes имена от TextBox11 до TextBox20 . Если вы хотите n быть только нечетным или только четным, добавьте это в качестве критерия в Where метод.

5. @SindhuHalesh, смотрите дополнение к моему ответу.