Вы не можете найти элементы ToolStrip или MenuStrip в коллекции Form.Control, потому что эти элементы пользовательского интерфейса не являются элементами управления, а представляют собой особую породу компонентов.
Хотя ToolStrip и MenuStrip наследуются от Control, ToolStripMenuItems наследуются от Component и ToolStripItem (последний предоставляет свойство Enabled
).
Вы можете создать Dictionary(Of String, Boolean)
, содержащий имена элементов пользовательского интерфейса, которые нужно включить или отключить, на основе значений, хранящихся в имеющемся у вас источнике данных.
Используйте метод, который считывает поля текущей формы, l oop the KeyValuePairs
в словаре, чтобы найти элементы, соответствующие словарю Keys
, и устанавливает свойство Enable
на основе соответствующего Values
.
Например, чтобы отключить все элементы в коллекции:
(я предполагаю, что вы сохранили все разные имена для каждой формы в своем источнике данных)
Dim names As New Dictionary(Of String, Boolean)()
' [...]
While df_reader.Read()
names.Add(df_reader("ref_text").ToString(), False)
End While
EnableDisableFormElements(Me, names)
В методе используется Type.GetFields () , чтобы найти все не опубликованные c поля экземпляра указанной формы, FieldInfo.GetValue () для получения экземпляра Элемент пользовательского интерфейса, представленный этим полем.
Затем он определяет, является ли элемент пользовательского интерфейса Control или ToolStripItem (элементы пользовательского интерфейса, которые наследуются от этих базовых классов, имеют свойство Enabled
), и устанавливает его, используя значение, хранящееся в словаре.
TrimStart("_"c)
присутствует, потому что VB. Net имеет (IMO) плохую привычку добавлять подчеркивание к этим именам полей. При использовании C# этого не происходит.
Imports System.Reflection
Imports System.Windows.Forms
Private Sub EnableDisableFormElements(parentForm As Form, elementNames As Dictionary(Of String, Boolean))
Dim allFields = parentForm.GetType().GetFields(BindingFlags.NonPublic Or BindingFlags.Instance)
For Each element As KeyValuePair(Of String, Boolean) In elementNames
Dim searchElement = allFields.FirstOrDefault(
Function(f) f.Name.TrimStart("_"c).Equals(element.Key)).GetValue(parentForm)
If searchElement IsNot Nothing Then
If TypeOf searchElement Is Control Then
DirectCast(searchElement, Control).Enabled = element.Value
ElseIf TypeOf searchElement Is ToolStripItem Then
DirectCast(searchElement, ToolStripItem).Enabled = element.Value
End If
End If
Next
End Sub