2015-09-10 3 views
1

Исходя из VB6, где у вас могут быть управляющие массивы. Когда вы назвали элемент управления таким же, как и другой, вы можете создать массив управления, а затем обратиться к каждому экземпляру элемента управления по индексу.Ищите хорошую альтернативу массивам элементов управления

Мне было интересно, как мы это делаем в VB.NET. В настоящее время я должен сделать это, которое является утомительным:

lblDetails1.Text = "" 
lblDetails2.Text = "" 
lblDetails3.Text = "" 
lblDetails4.Text = "" 
lblDetails5.Text = "" 
lblDetails6.Text = "" 
lblDetails7.Text = "" 
lblDetails8.Text = "" 
lblDetails9.Text = "" 
lblDetails10.Text = "" 
lblDetails11.Text = "" 
. 
. 
. 
lblDetails40.Text = "" 

С уважением

Graham

+0

Вы можете хранить имена в 'List (Of String) 'и использовать его в цикл через Me.Controls или сохранить ссылку на фактический контроль в' List (этикеточной) ' – Plutonix

+1

Вот ссылка на вопрос, я думаю, похожа на то, о чем вы просите. Я использовал Linq в своем ответе. Также у оригинального плаката есть другой способ сделать то, что вы хотите. http://stackoverflow.com/questions/29832504/changing-the-text-of-all-the-buttons-on-a-form-in-vb-net/29832737#29832737 – Timmy

+0

Ищите пример кода, все элементы управления и тест для «TextBox». Обратите внимание, что элемент управления и контейнер с другими элементами управления. Верхний уровень Me.Controls on возвращает верхний уровень. – rheitzman

ответ

1

Это довольно просто, вы могли бы перебрать управления.

for (int i = 0; i < this.Controls.Count - 1; i++) 
{ 
    if (this.Controls[i].GetType() == typeof(TextBox)) 
    { 
     ((TextBox)this.Controls[i]).Clear(); 
    } 
} 
+2

Это только в том случае, если элементы управления имеют одну поверхность. Что делать, если они вложены в 30 слоев? Рекурсия необходима. –

+0

@ T.S., True, это самый простой пример, основанный только на том, что в настоящее время находится в вопросе OP. – jac

+1

Мы действительно не знаем, что спрашивает ОП. Полностью вне контекста –

0

Вот один из способов перебрать все элементы управления и изменить текстовые поля. Имеет недостаток, который пропускает SplitterControl.

Dim ctl As Control = Me ' top level seed 
    Do 
     If Not ctl.HasChildren Then 
      If TypeOf ctl Is TextBox Then 
       ctl.Text = "" 
      End If 
     End If 
     ctl = Me.GetNextControl(ctl, True) ' does not reach into SpliterControls 
    Loop Until ctl Is Nothing 
1

Контрольные массивы были концепцией конструктора VB6, которая не переносилась в .NET WinForms. Однако вы можете имитировать поведение, просматривая все элементы управления и проверяя, начинается ли имя с того же текста, а затем добавляются те, которые соответствуют массиву.

Я создал для вас метод расширения. Просто сохраните это как новый модуль в своем проекте и в любой форме, которую вы можете назвать.

Imports System.Runtime.CompilerServices 

Public Module FormExtensions 
    <Extension()> 
    Public Function GetControlArray(Of TControl As Control)(extForm As Form, namePart As String, container As Control) As IEnumerable(Of TControl) 


     Dim controls = From control In container.Controls.OfType(Of TControl) 
         Where control.Name.StartsWith(namePart) 
         Select control 

     Dim containerSets = From control In container.Controls.OfType(Of Control) 
          Where control.Controls.Count > 0 
          Select GetControlArray(Of TControl)(extForm, namePart, control) 

     For Each item As IEnumerable(Of TControl) In containerSets 
      controls = controls.Union(item) 
     Next 

     Return controls 
    End Function 
End Module 

Теперь в вашей форме вы можете позвонить и через элементы управления. В этом примере я получаю все ярлыки, которые начинаются с определенного имени, а затем изменяют текст для соответствия. Порядок элементов управления основан на том порядке, в котором они были добавлены в форму.

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 

    Dim controls = GetControlArray(Of Label)("MyLabel", Me) 

    For Each item As Label In controls 
     item.Text = "Found" 
    Next 

End Sub 

Этикетки я добавил в форму была названа как это (взято из конструктора сгенерированного кода)

Me.MyLabel1 = New System.Windows.Forms.Label() 
Me.MyLabel2 = New System.Windows.Forms.Label() 
Me.MyLabel3 = New System.Windows.Forms.Label() 
Me.MyLabel4 = New System.Windows.Forms.Label() 
Me.MyLabel5 = New System.Windows.Forms.Label() 
Me.MyLabel6 = New System.Windows.Forms.Label() 
Me.Label1 = New System.Windows.Forms.Label() 
Me.Label2 = New System.Windows.Forms.Label() 
Me.Panel2 = New System.Windows.Forms.Panel() 
Me.MyLabel7 = New System.Windows.Forms.Label() 
Me.Label4 = New System.Windows.Forms.Label() 
Me.Label5 = New System.Windows.Forms.Label() 

Вот фотография моего дизайнера с вложенным управлением контейнерным. Кроме того, до и после изображения формы.

Preview of form designer and code results