Получить имя и свойства элементов управления динамически - PullRequest
0 голосов
/ 07 января 2020

У меня есть 10 TrackBar1 TrackBar2, TrackBar3 ..... TrackBar10. То, что я хочу, это как манипулировать им.

У меня проблема с доступом к свойству элемента управления TrackBar Min, Max, Value ....

For i = 1 to 10

  ' its OK
  Me.Controls("TrackBar" & i.ToString("0")).Text = "Test1"

  ' Error -Min is not a member "System.Windows.Forms.Control"
  Me.Controls("TrackBar" & i.ToString("0")).Min = 10      

Next

1 Ответ

0 голосов
/ 07 января 2020

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...