VB.NET… Loop help

Я использую My.Settings в Visual Studio 2008 для хранения информации, когда пользователь снова запускает программу.

У меня это работает нормально ... но так как я использую 12 текстовых полей, я не хочу писать ...

my.settings.grade1 = textbox1.text

для каждого, и я также делаю вычисления, используя сохраненную информацию, поэтому я не хочу писать my.settings.grade1 + my.settings.grade2 и т. д.

Любая помощь приветствуется

Спасибо =)

12.12.2008 19:36:40
Пожалуйста, вставьте конкретный код, с которым у вас возникли проблемы.
George Stocker 13.12.2008 15:22:58
5 ОТВЕТОВ

В форме, в которой есть текстовые поля, добавьте их в коллекцию или массив текстовых полей при инициализации формы.

Затем выполните итерацию по коллекции или массиву текстовых полей, чтобы назначить значение параметра.

Если вы не хотите вручную кодировать назначение текстовых полей в массив, то в коде инициализации формы выполните итерацию всех элементов управления в форме и проверьте тип элемента управления или спецификацию «Тег», которую вы назначаете каждому текстовому полю, затем добавьте каждое текстовое поле в массив таким образом.

For Each c as Control in Me.Controls

 If c.Tag.ToString() = "Grade" Then
  ' Add Items to collection here '
 End If

Next c
1
12.12.2008 19:49:09

Вы имеете в виду что-то подобное?

    Dim sum As Long
    Dim grades(11) As Long

    Dim i As Integer = 0
    For Each ctr In Controls
        If TypeOf (ctr) Is TextBox Then
            grades(i) = CLng(ctr.Text)
            sum = sum + grades(i)
            i = i + 1
        End If
    Next
-1
12.12.2008 19:54:32
откуда вы знаете, что элементы управления находятся в том же порядке, что и данные? Вы не хотите перебирать все элементы управления в форме, поскольку у вас могут быть элементы управления, которым не нужно присваивать значения.
Victor 12.12.2008 19:56:38
ОП не уточнил детали. Я просто пытался представить возможный метод - реальный код должен был бы соответствовать конкретным требованиям.
Jim Anderson 12.12.2008 20:03:46
Если там есть что-то кроме текстового поля оценок, ваши индексы окажутся вне границ.
Joel Coehoorn 12.12.2008 20:50:21

или вы могли бы сделать что-то вроде этого:

с учетом того, что ваши текстовые поля названы так: Grade1, Grade2, Grade3 и т. д.

Вы можете сохранить оценки в массиве, а затем перебрать массив:

((TextBox)form.findControl("Grade" + i.ToString())).Text = Grade(i)

В зависимости от вашего расчета, вы также можете выполнить расчет внутри цикла.

0
12.12.2008 20:01:17
Да, это лучше, чем моя идея (если имя текстового поля содержит индекс оценки).
Jim Anderson 12.12.2008 20:19:45

Заполните список текстовых полей:

'at the class level'
Public GradeBoxes(11) As TextBox
Const grade As String = "GRADE"

'when the form is created'
Dim i As Integer = 0
For Each ctr As Control In Controls
    If TypeOf (ctr) Is TextBox AndAlso ctr.Name.ToUpper.StartsWith(grade) Then
        i = CInt(ctr.Name.SubString(grade.Length))
        If i >= 0 AndAlso i < GradeBoxes.Length Then GradeBoxes(i) = ctrl
    End If
Next ctr

For Each box As TextBox in GradeBoxes
    If box IsNot Nothing AndAlso My.Settings(box.Name) IsNot Nothing Then
        box.Text = My.Settings(box.Name)
    End If
Next box

Сохранить оценки:

For Each box As TextBox in GradeBoxes
    If box IsNot Nothing AndAlso My.Settings(box.Name) IsNot Nothing Then
        My.Settings(box.Name) = box.Text
    End If
Next box
My.Settings.Save()
0
12.12.2008 21:12:03

Рассматривали ли вы возможность использования ApplicationSettings Binding для автоматической привязки ваших значений к вашим свойствам Textboxes.Text. Это будет поддерживать двухстороннее связывание, и тогда все, что вам нужно сделать, это сохранить вызов при закрытии.

1
12.12.2008 21:18:20