2014-04-02 3 views
1

Я пишу немного кода VB.Net для заполнения текстовых и графических блоков в форме окна из массива, но это, кажется, довольно неэффективный способ делать вещи:Перебор переменных в форме Windows,

Item1_TB.Text = FormatCurrency(Items(0).Item_Cost, 2) 
Item2_TB.Text = FormatCurrency(Items(1).Item_Cost, 2) 
Item3_TB.Text = FormatCurrency(Items(2).Item_Cost, 2) 
Item4_TB.Text = FormatCurrency(Items(3).Item_Cost, 2) 
Item5_TB.Text = FormatCurrency(Items(4).Item_Cost, 2) 
Item6_TB.Text = FormatCurrency(Items(5).Item_Cost, 2) 

Item1.Image = Image.FromFile(Items(0).Item_Image) 
Item2.Image = Image.FromFile(Items(1).Item_Image) 
Item3.Image = Image.FromFile(Items(2).Item_Image) 
Item4.Image = Image.FromFile(Items(3).Item_Image) 
Item5.Image = Image.FromFile(Items(4).Item_Image) 
Item6.Image = Image.FromFile(Items(5).Item_Image) 

есть ли способ, что я могу отказаться от этого внутри для цикла и использовать что-то подобное:

Item[i]_TB.Text = FormatCurrency(Items(i).Item_Cost, 2) 
Item[i].Image = Image.FromFile(Items(i).Item_Image) 
+1

Вы можете найти элементы управления динамически по имени, но я бы не рекомендовал его. Вы также можете хранить свои элементы управления в массиве. – Crono

+0

Спасибо за это, я сделаю небольшое исследование и отдам его. – user2956578

ответ

0

Размещение всех элементов управления в подобном массив позволяет перекручивание.

Можно использовать формат, как это ...

Dim ctls() as control={Item1_TB, Item2_TB, etc... } 
For iQ as integer = 0 to ubound(ctls) 
    ctls(iQ).Text = .FormatCurrency(Items(iQ).Item_Cost, 2) 
Next iQ 
1

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

dim tb as textbox 
dim i as integer 
for each o as object in me.controls 
if typeof(o is textbox) then 
    tb = ctype(o,textbox) 
    i = tb.name.substring(4,1) 
    tb.Text = FormatCurrency(Items(i).Item_Cost, 2) 
end if 
next 
+0

+1 хотя я предлагаю вам пересмотреть свое сообщение, чтобы уточнить, что родительский контроль против контейнера. (Что в этом случае они одинаковы) –

0

Это немного схематичны, поскольку предполагается, что вы никогда не будете иметь больше, чем девять управления (то есть от 1 до 9), и это предполагает, что TextBox и PictureBox управления трактуются одинаково. Если у вас есть дополнительные элементы управления TextBox или PictureBox в форме, это не сработает.

For Each control In Me.Controls 
    If TypeOf control Is TextBox Then 
     Dim txt As TextBox = CType(control, TextBox) 
     Dim index As Integer = CInt(txt.Name.Substring(4, 1)) 

     txt.Text = FormatCurrency(Items(index - 1).Item_Cost, 2) 
    ElseIf TypeOf control Is PictureBox Then 
     Dim pic As PictureBox = CType(control, PictureBox) 
     Dim index As Integer = CInt(pic.Name.Substring(4, 1)) 

     pic.Image = Image.FromFile(Items(index - 1).Item_Image) 
    End If 
Next 

Это может быть сделано, чтобы работать более девяти элементов управления, но Name.Substring вызов должен был бы быть более умным.

UPDATE

Я просто подумал, что другого варианта. Оба TextBox и PictureBox имеют свойство Tag. Вы можете использовать это для обозначения индекса. Если свойство Tag не установлено, вы просто пропустите его.

For Each control In Me.Controls 
    If TypeOf control Is TextBox Then 
     Dim txt As TextBox = CType(control, TextBox) 

     If Not txt.Tag Is Nothing Then 
      Dim index As Integer = CInt(txt.Tag) 

      txt.Text = FormatCurrency(Items(index).Item_Cost, 2) 
     End If 
    ElseIf TypeOf control Is PictureBox Then 
     Dim pic As PictureBox = CType(control, PictureBox) 

     If Not pic.Tag Is Nothing Then 
      Dim index As Integer = CInt(pic.Name.Substring(4, 1)) 

      pic.Image = Image.FromFile(Items(index).Item_Image) 
     End If 
    End If 
Next 

Преимущество этого в том, что вы никогда не должны изменить ваш код, если вы добавляете новую пару TextBox/PictureBox к окну. Просто добавьте элементы управления, установите свойство Tag в индекс массива Items, который должен использоваться для заполнения каждого из них и от вас.

0

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

Dim textboxesRange As TextBox() 
Dim pictureboxesRange As PictureBox() 

В вашем конструкторе вам придется инициализировать эти диапазоны.

Public Sub New() 
    // ... 

    textboxesRange = {Item1_TB, Item2_TB, Item3_TB, Item4_TB, Item5_TB, Item6_TB } 
    pictureboxesRange = {Item1, Item2, Item3, Item4, Item5, Item6 } 

    // ... 
End Sub 

После этого, вы будете иметь возможность перебрать эти массивы:

For i = 0 To textboxesRange.Length - 1 
    textboxesRange(i).Text = FormatCurrency(Items(i).Item_Cost, 2) 
Next 

For i = 0 To pictureboxesRange.Length - 1 
    pictureboxesRange(i).Image = Image.FromFile(Items(i).Item_Image) 
Next 

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

При использовании элементов управления Name или Tag свойства могут очень хорошо работать, это плохая практика ИМХО, поскольку они не предназначены для решения такой конкретной проблемы. Старайтесь никогда не полагаться на них.

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