2015-03-08 2 views
1

Сегодня я попросил помощь на пробегает по всем элементам управления в форме на заказ для ссылки NumericUpDown, и это было принято отвечать:Перебор управления по TabOrder

Dim errors As String = "" 
For Each ctrl As Control In Me.Controls 
    Dim num = TryCast(ctrl, NumericUpDown) 
    If num IsNot Nothing AndAlso (num.Value < 1 OrElse num.Value > 50) Then 
     errors += ctrl.Name + " is out of range." + Environment.NewLine 
    End If 
Next 

Позже, развивая свою программу, я понял, что NumericUpDown являются перечисленные в (для меня) неизвестный порядок, и это не нужен результат.
Мне бы хотелось/нужно, чтобы NumericUpDown был зациклен индексом порядка вкладок.

Любое предложение, как получить это с замечанием о том, что linq недоступен, поскольку это приложение предназначено для .NET framework 2.0.

+0

Эти элементы управления созданы динамически? Или вы их разработали через конструктора форм? В последнем случае вы можете подготовить массив своих элементов управления и поместить их в том порядке, который вам нравится. Затем цикл чрезвычайно упрощен. – Steve

+0

Контроли создаются дизайнером, а не динамически. Можете ли вы показать код для этого? –

ответ

1

Предположим, что у вас есть три NumericUpDown управления определены в конструкторе и назван numericUpDown1,numericUpDown2,numericUpDown3 Теперь объявить глобальную переменную в классе формы

Public Class MyForm 

    Dim numUpDnList(2) As NumericUpDown 
    .... 

Затем в коде (возможно, в случае загрузки формы) добавить их в переменная массива в том порядке, что вам требуется

Protected Sub MyForm_Load(sender as Object, e as EventArgs) Handles Form.Load 

     numUpDnList(0) = numericUpDown1 
     numUpDnList(1) = numericUpDown3 
     numUpDnList(2) = numericUpDown2 

End Sub 

в этот момент, когда вам нужно перечислить эти элементы управления, код довольно прост

Dim errors As String = "" 
For Each num In numUpDnList 
    If (num.Value < 1 OrElse num.Value > 50) Then 
     errors += num.Name + " is out of range." + Environment.NewLine 
    End If 
Next 

Существует также другой способ петли над коллекцией Controls с использованием метода GetNextControl, который следует за TabOrder.

Dim errors as String 
Dim ctrl = Me.GetNextControl(f, true) 
while ctrl IsNot Nothing 
    Dim num = TryCast(ctrl, NumericUpDown) 
    If num IsNot Nothing AndAlso (num.Value < 1 OrElse num.Value > 50) Then 
     errors += ctrl.Name + " is out of range." + Environment.NewLine 
    End If   
    ctrl = f.GetNextControl(ctrl, true) 
End While 
+0

Ну, Стив, я бы подождал некоторое время, чтобы получить более общее решение. Разве здесь нет способа заставить «для каждого» зацикливаться на каком-то предсказуемом порядке? По Control.TabIndex или даже с помощью Control.Name? –

+0

Нет AFAIK, если вы не можете использовать Linq, вы вынуждены сортировать элементы управления, используя свое собственное правило. См. Реализацию пользовательского класса IComparer в примере [Array.Sort в MSDN] (https://msdn.microsoft.com/en-us/library/aw9s5t8f (v = vs.80) .aspx). Но это похоже на быть больше проблем, чем вам действительно нужно для этого случая. Я всегда предпочитаю использовать простые и понятные решения, если нет особых требований к созданию более общей логики. – Steve

+0

Спасибо, что помогли Стиву, но я не могу поверить, что простой и более общий способ здесь не существует, как в VB6. Например, если команда SelectNextControl «знает», которая является следующим (или предыдущим) элементом управления индексом вкладок, то здесь «должен» быть каким-то прямым способом для управления контуром с помощью без рабочего окружения. Если я не исправлю это решение, я буду использовать ваше предложение с массивом NUD-s. –

Смежные вопросы