#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, смотрите дополнение к моему ответу.