2016-06-10 2 views
1

Я создаю «форму предпочтения», которая будет содержать все предпочтения пользователей и когда они перейдут на «Применить/Сохранить». Я хочу, чтобы новые значения возвращались к основной форме и обновлялись и закрывали форму2. В прошлом я сделал это так:Передача данных между формами DIRECTLY

Private Sub PreferencesToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles PreferencesToolStripMenuItem.Click 
    Preferences.Show() 
End Sub 

и при нажатии на кнопку «Применить/Сохранить» перед закрытием я Перенести все данные, как это:

form1.textbox.text = form2.textbox.text 

Есть ли что-нибудь неправильно делаю это так?

То, что я читал, я должен делать это так:

Private Sub PreferencesToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles PreferencesToolStripMenuItem.Click 
    Dim dialog As New Preferences 
    dialog.ShowDialog() 
End Sub 

И когда при нажатии «Применить/Сохранить» он будет принимать все значения из Form2 и хранить их в частной переменной (или собственности) в Form2 и когда форма закрывается, я бы тогда получить доступ к значению, как это:

Private Sub PreferencesToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles PreferencesToolStripMenuItem.Click 
    Dim dialog As New Preferences 
    dialog.ShowDialog() 

    form1.textbox.text = dialog.variable 
End Sub 

Почему это лучший способ сделать это?

ОБНОВЛЕНИЕ .... Глядя на код ниже, это всего лишь малый образец всех вариантов, которые у меня будут. Каков наилучший способ сбора данных в объект, который будет использоваться при сериализации?

<Serializable> 
Public Class Preference 

#Region "Properties" 
    Public Property ScaleLowest As String = "5" 
    Public Property ScaleHighest As String = "200" 
    Public Property ScaleInc As String = "5" 
    Public Property ThickLowest As Double = 0.125 
    Public Property ThickHighest As Double = 4 
    Public Property ThickInc As Double = 0.125 
    Public Property WidthLowest As Double = 0.125 
    Public Property WidthHighest As Double = 0.6 
    Public Property WidthInc As Double = 0.125 
    Public Property LengthLowest As Double = 1 
    Public Property LengthHighest As Double = 96 
    Public Property LengthInc As Double = 1 
    Public Property FractionON As Boolean = False 
    Public Property DecimalON As Boolean = True 
    Public Property ColorSelection As String = "Colors" 
    Public Property FinalColor As String = "255, 255, 0" 
    Public Property roughColor As String = "255, 255, 100" 
    Public Property SplashON As Boolean = False 
    Public Property LogInON As Boolean = False 
#End Region 

    Public Sub New() 
     'for creating new instance for deserializing 
    End Sub 

    Public Sub GatherAllData() 

     'Save Defaults 
     SaveSerializeObj() 

    End Sub 

    Public Sub SaveSerializeObj() 
     'Get Changes????? 

     'Serialize object to a text file. 
     Dim objStreamWriter As New StreamWriter("C:\Users\Zach454\Desktop\test.xml") 
     Dim x As New XmlSerializer(Me.GetType) 
     x.Serialize(objStreamWriter, Me) 
     objStreamWriter.Close() 

    End Sub 

    Public Function LoadSerializeObj() As Preference 

     'Check if new file need created 
     If File.Exists("C:\Users\454\Desktop\test.xml") = False Then 
      SaveSerializeObj() 
     End If 

     'Deserialize text file to a new object. 
     Dim objStreamReader As New StreamReader("C:\Users\454\Desktop\test.xml") 
     Dim newObj As New Preference 
     Dim x As New XmlSerializer(newObj.GetType) 
     newObj = CType(x.Deserialize(objStreamReader), Preference) 
     objStreamReader.Close() 

     Return newObj 
    End Function 
+1

Если у вас есть много пользовательских параметров, вы можете захотеть иметь класс, отвечающий за загрузку, сохранение, отображение и редактирование. Тогда любой актер, которому нужно знать 'SaveFolder' или что-то еще, может извлечь его из этого класса. Как только вы обнаружите ООП, передача данных между формами очень редко происходит. Кроме того, вы в конце концов ударите кирпичную стену, используя экземпляры формы по умолчанию. – Plutonix

+0

Сделайте другой класс вне form1 и form2? – goomba454

+0

Yup. Каждый пользовательский параметр может быть свойством (или в некоторых случаях), чтобы другие участники могли загружать все, что им нужно, без загрузки какой-либо формы; формы - это то, как приложения/код взаимодействуют с пользователями. Для тривиального числа параметров вы можете просто использовать встроенный 'Настройки' – Plutonix

ответ

0

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

Также нет причин для передачи данных туда и обратно, вы можете хранить эти данные где-нибудь (база данных, файл, mysettings и т. Д.), А затем загружать эти данные в класс. Затем вы можете хранить и извлекать данные из этого класса. Затем, если вам нужно сохранить данные назад, у вас есть объект класса для использования.

Вот краткий пример, показывающий, как вы можете создать другую форму (Предпочтения), нажмите «Сохранить», а затем верните эти значения в другую форму (форму вызова).

Это основная форма

Public Class Form1 
    Public _frm2 As Form2 

    Private Sub btnShowPreferences_Click(sender As Object, e As EventArgs) Handles btnShowPreferences.Click 
     Using _frm2 As New Form2() 
      'if we clicked save on the form then show the values in the 
      'controls that we want to 
      If _frm2.ShowDialog() = Windows.Forms.DialogResult.OK Then 
       txtFirstName.Text = _frm2._Preferences.FirstName 
       txtLastName.Text = _frm2._Preferences.LastName 
      End If 
     End Using 
    End Sub 

End Class 

Вот пример (Preferences) класса

Этот класс будет содержать все свои свойства предпочтений. Это пример, вы можете изменить все, что вам нужно, чтобы удовлетворить ваши потребности.

Option Strict On 

Public Class Preferences 

#Region "Properties" 
    Public Property FirstName As String 
    Public Property LastName As String 
#End Region 

    Public Sub New() 

    End Sub 

End Class 

Второй Form может быть ваш (Preference) форма со всеми элементами управления пользователю необходимо будет взаимодействовать с.

Public Class Form2 

    Public _Preferences As New Preferences 'create class variable you can use for later to store data 

    Private Sub btnSave_Click(sender As Object, e As EventArgs) Handles btnSave.Click 
     'set your properties of the class from your form. this will then hold everything you can get from 
     'the first form... 
     With _Preferences 
      .FirstName = txtFirstName.Text 
      .LastName = txtLastName.Text 
     End With 

     Me.DialogResult = Windows.Forms.DialogResult.OK 'this is used to determine if user clicked a save button... 

    End Sub 
End Class 

Надеюсь, это поможет вам, если вы что-то не понимаете, пожалуйста, дайте мне знать.

+0

Спасибо за ваше предложение Zaggler, я добавил обновленный фрагмент кода, что было бы лучшим способом собрать эти данные в этот класс или объект? Я ценю вашу помощь! – goomba454

+0

@ goomba454, если вы посмотрите выше в разделе 'Form2', вы увидите, где я использую переменную' _Preferences', чтобы установить свойства из элементов управления. Это все, что вам нужно будет сделать. Например, '.ScaleLowest = txtScaleLowest.Text', вы должны установить свое свойство из значения элементов управления ... – Codexer

+0

Хорошо, я понимаю, поэтому у меня может быть масса переменных, которые я должен жестко указывать по крайней мере один раз! Спасибо за вашу помощь! – goomba454

0

Чтобы ответить на ваш вопрос, основное различие в ваших двух образцах кода состоит в том, что второе использует ShowDialog для открытия формы по модулю, по сравнению с первым образцом, который позволяет вам взаимодействовать с родительской формой, пока вторая открыта.
Второй подход может быть лучше с точки зрения управления потоком пользователей. Если ваш реальный вопрос заключается в том, следует ли возвращать данные в основную форму или извлекать данные из диалогового окна, вероятно, лучше извлечь из диалога. Этот подход делает диалог повторно используемым из других форм.

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