直接在表单之间传递数据

时间:2016-06-10 00:29:47

标签: vb.net

我正在制作一个"偏好形式"这将保留所有用户首选项,当他们转到应用/保存时,我希望新值转移回主窗体并更新并关闭form2。在过去,我这样做了:

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

2 个答案:

答案 0 :(得分: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

以下是一个示例(首选项)类

此类将保留首选项的所有属性。这是一个例子,您可以根据需要更改所需的任何内容。

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可能是您的(偏好)表单,其中包含用户需要与之交互的所有控件。

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

我希望这是你的开始,如果你不明白的话请告诉我。

答案 1 :(得分:0)

要直接回答你的问题,你的两个代码示例的主要区别在于,第二个使用ShowDialog以模态方式打开表单,而第一个示例允许您与父表单进行交互,而第二个示例是打开的。
从用户流控制的角度来看,第二种方法可能更好。如果您真正的问题是是将数据推回到主窗体还是从对话框中提取数据,那么最好从对话框中提取数据。这种方法使对话可以从其他形式重用。