Когда вы индексируете коллекцию Controls
, вы получаете ссылку Control
. В этой коллекции может храниться любой тип элемента управления, поэтому единственное, что у них общего, - это то, что они наследуют класс Control
. Это означает, что вы можете получить доступ к любым членам класса Control
напрямую. Text
является членом класса Control
, поэтому вы можете напрямую получить доступ к свойству Text
. Любые члены, которые имеют более конкретное значение c, чем те, которым требуется приведение в качестве более определенного типа c, чтобы получить к ним доступ. Если вы хотите получить доступ к членам класса TrackBar
, вам нужна ссылка типа TrackBar
, а не типа Control
, что означает приведение типа к этому типу.
Dim c = Me.Controls("TrackBar" & i)
Dim t = DirectCast(c, TrackBar)
Чтобы объяснить приведение, я всегда используйте пример с домашним животным. Ветеринар может относиться ко всем типам животных, но когда вы берете своего питомца, это определенный тип c животного. Когда вы дарите ветеринару коробку, все, что они знают, это то, что внутри есть животное, поэтому все, что они могут сделать, - это то, что применимо ко всем животным. Как только вы достанете своего питомца из коробки, и они увидят, что это за животное, они узнают, что могут сделать все, что указано для этого типа животного. Ваш питомец волшебным образом не переключался с одного типа на другой, но ветеринар теперь знает все специфические c вещи, которые он может для него сделать, а также общее.
Вот как работает кастинг в программировании. Ваш TrackBar
всегда был TrackBar
, но, поскольку к нему изначально обращались по ссылке Control
, компилятор знал только, что он может делать с ним то, что является общим для всех элементов управления. Приведение информирует компилятор о специфицированном типе c, поэтому компилятор знает, что он может что-то делать с ним, указав c для этого типа.
Один из способов избежать явного приведения - просто получить TrackBars
в первую очередь:
For Each tb In Me.Controls.OfType(Of TrackBar)()
'Use tb here.
Next
Метод OfType
отфильтровывает все элементы не указанного типа и возвращает ссылки указанного типа, поэтому tb
имеет тип TrackBar
in этот код. В этом случае вам придется использовать For Each
l oop, чтобы вы меньше контролировали порядок доступа к элементам. Они будут возвращены в соответствии с z-порядком в форме. Это означает, что если вы добавили их в порядке возрастания чисел, что кажется вероятным, и не изменили порядок z, вы все равно вернете их в порядке возрастания чисел.