我正在制作一个"偏好形式"这将保留所有用户首选项,当他们转到应用/保存时,我希望新值转移回主窗体并更新并关闭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
答案 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以模态方式打开表单,而第一个示例允许您与父表单进行交互,而第二个示例是打开的。
从用户流控制的角度来看,第二种方法可能更好。如果您真正的问题是是将数据推回到主窗体还是从对话框中提取数据,那么最好从对话框中提取数据。这种方法使对话可以从其他形式重用。