Vb.net 在表单之间直接传递数据

Vb.net 在表单之间直接传递数据,vb.net,Vb.net,我正在制作一个“首选项表单”,它将保存所有用户的首选项,当他们开始应用/保存时,我希望新值传输回主表单并更新并关闭表单2。过去我是这样做的: Private Sub PreferencesToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles PreferencesToolStripMenuItem.Click Preferences.Show() End Sub form1.textbox.text = fo

我正在制作一个“首选项表单”,它将保存所有用户的首选项,当他们开始应用/保存时,我希望新值传输回主表单并更新并关闭表单2。过去我是这样做的:

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
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
当我在“应用/保存”按钮关闭前单击该按钮时,我会像这样传输所有数据:

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
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
这样做有什么不对吗

我一直在读的是我应该这样做:

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
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
当他们单击“应用/保存”时,它将获取Form2中的所有值并将它们存储在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
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

公共阶级偏好
#区域“财产”
公共属性ScaleLowest为String=“5”
公共属性ScaleHighest为String=“200”
公共属性ScaleInc为String=“5”
公共财产最低限额为双倍=0.125
公共属性的最大值为Double=4
公共财产的双重价值=0.125
公共财产宽度最低为双=0.125
公共财产的最大宽度为Double=0.6
公共财产宽度(双倍=0.125)
公共财产最短长度为双=1
公共财产长度最高为Double=96
公共属性长度(双精度=1)
公共属性FractionON作为布尔值=False
公共属性DecimalON为布尔值=True
公共属性ColorSelection为String=“Colors”
公共属性FinalColor As String=“255,255,0”
公共属性roughColor为String=“255,255,100”
公共属性SplashON为布尔值=False
公共属性LogInON为Boolean=False
#末端区域
公共分新()
'用于创建用于反序列化的新实例
端接头
公共子集合AllData()
'保存默认值
saveObj()
端接头
公共子对象
'获取更改?????
'将对象序列化为文本文件。
Dim objStreamWriter作为新的StreamWriter(“C:\Users\Zach454\Desktop\test.xml”)
Dim x作为新的XmlSerializer(Me.GetType)
x、 序列化(objStreamWriter,Me)
objStreamWriter.Close()
端接头
公共函数LoadSerializeObj()作为首选项
'检查是否需要创建新文件
如果File.Exists(“C:\Users\454\Desktop\test.xml”)=False,则
saveObj()
如果结束
'将文本文件反序列化为新对象。
Dim objStreamReader作为新的StreamReader(“C:\Users\454\Desktop\test.xml”)
Dim newObj作为新的首选项
Dim x作为新的XmlSerializer(newObj.GetType)
newObj=CType(x.Deserialize(objStreamReader),首选项)
objStreamReader.Close()
返回newObj
端函数

最好的选择是创建一个类,该类将具有表单控件的属性。然后可以存储这些属性,然后在需要时访问这些属性

此外,实际上没有理由来回传递数据,您可以将这些数据存储在某个位置(数据库、文件、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
第二个
表单
可以是您的(首选)表单,其中包含用户需要与之交互的所有控件

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

我希望这是您开始学习的地方,如果您不了解某些内容,请告诉我。

最好的选择是创建一个类,该类将具有表单控件的属性。然后可以存储这些属性,然后在需要时访问这些属性

此外,实际上没有理由来回传递数据,您可以将这些数据存储在某个位置(数据库、文件、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
第二个
表单
可以是您的(首选)表单,其中包含用户需要与之交互的所有控件

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

我希望这是您的开始,如果您不了解一些内容,请让我知道。

为了直接回答您的问题,您的两个代码示例的主要区别在于,第二个示例使用ShowDialog以模式打开表单,而第一个示例允许您在第二个示例打开时与父窗体交互。

从用户流控制的角度来看,第二种方法可能更好。如果您真正的问题是将数据推回到主窗体还是从对话框中提取数据,那么最好从对话框中提取数据。这种方法使对话框可以从其他表单中重用

为了直接回答您的问题,您的两个代码示例的主要区别在于,第二个示例使用ShowDialog以模式打开表单,而第一个示例允许您与父表单交互,而第二个示例是