Я использую My.Settings в Visual Studio 2008 для хранения информации, когда пользователь снова запускает программу.
У меня все работает нормально ... но поскольку я использую 12 текстовых полей, я не хочу писать ...
my.settings.grade1 = textbox1.text
для каждого, и я также делаю расчеты, используя сохраненную информацию, поэтому я не хочу писать my.settings.grade1 + my.settings.grade2 и т. д.
Любая помощь приветствуется
Спасибо =)





В вашей форме, которая имеет текстовые поля, добавьте их в коллекцию или массив текстовых полей при инициализации формы.
Затем выполните итерацию по коллекции или массиву текстовых полей, чтобы присвоить значение параметра.
Если вы не хотите вручную кодировать назначение текстовых полей в массив, то в коде инициализации формы выполните итерацию по всем элементам управления в форме и проверьте тип элемента управления или специальный «Тег», который вы назначаете каждому текстовому полю, затем таким образом добавьте каждое текстовое поле в массив.
For Each c as Control in Me.Controls
If c.Tag.ToString() = "Grade" Then
' Add Items to collection here '
End If
Next c
Вы имеете в виду что-то вроде?
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
как узнать, что элементы управления расположены в том же порядке, что и данные? Вы не хотите перебирать каждый элемент управления в форме, поскольку у вас могут быть элементы управления, которым не нужно назначать значения.
В ОП не уточнили подробностей. Я просто пытался представить возможный метод - фактический код должен был адаптироваться к конкретным требованиям.
Если там есть что-нибудь, кроме текстового поля оценок, ваши индексы выйдут за границы.
или вы можете сделать что-то вроде этого:
учитывая, что ваши текстовые поля названы по строкам: Grade1, Grade2, Grade3 и т. д.
вы можете сохранить оценки в массиве, а затем перебрать этот массив:
((TextBox)form.findControl("Grade" + i.ToString())).Text = Grade(i)
В зависимости от вашего расчета вы также можете выполнить расчет внутри цикла.
Да, это лучше, чем моя идея (если имя текстового поля содержит индекс оценки).
Заполните список текстовых полей оценок:
'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()
Рассматривали ли вы возможность использования ApplicationSettings Binding для автоматической привязки ваших значений к свойствам Textboxes.Text. Это будет поддерживать двустороннюю привязку, а затем все, что вам нужно сделать, это вызвать сохранение при закрытии.
Вставьте конкретный код, с которым у вас возникла проблема.