使用 PropertyGrid 加载和保存数据






3.69/5 (8投票s)
一个简单的例子,演示如何使用序列化技术在 PropertyGrid 中加载、保存和显示对象。
引言
我最近一直在研究 Visual Basic 2008 中的 PropertyGrid 控件。网上有很多信息,主要针对 C# 程序员。经过一番研究和不可避免的尝试错误,我发现了一个网站上问题的回复,看起来像是对一个常见问题的答案:如何使用 VB.NET 将信息加载和保存到 PropertyGrid 中?不幸的是,该帖子有点晦涩。经过一番调整,我得到了以下一个完全可用的示例,并想与大家分享。
背景
以下示例是在 Windows Vista 和 Visual Basic Express Edition 2008 上开发的并经过测试,运行在 .NET 3.5 Framework 上,Internet Explorer 版本为 7。它应该适用于这些系统的早期版本。
Using the Code
该示例使用序列化将类对象加载和保存到 XML 文件中。为了实现这一点,只需将属性 <Serialize()> 添加到类标识符,如下所示
<Serializable()> _
Public Class AppSettings
您需要在您定义的类对象中添加两个函数/方法,以提供加载和保存功能。在下面的完整示例中,这些方法分别称为
Public Shared Function Load() As AppSettings
和
Public Sub Save()
然后,您只需在主类中包含以下代码,以交替加载或保存类对象到您的 PropertyGrid 中
Public Class Form1
    'Load AppSettings
    Dim _appSettings As New AppSettings()
    Private Sub Button1_Click(ByVal sender As System.Object, _
            ByVal e As System.EventArgs) Handles Button1.Click
        _appSettings = AppSettings.Load()
        ' Actually change the form size
        Me.Size = _appSettings.WindowSize
        PropertyGrid1.SelectedObject = _appSettings
    End Sub
    Private Sub Button2_Click(ByVal sender As System.Object, _
            ByVal e As System.EventArgs) Handles Button2.Click
        _appSettings.Save()
    End Sub
End Class
要运行以下完整的示例,请创建一个包含 PropertyGrid 和两个 Button 的窗体。单击 LOAD 按钮时,我们加载一个包含已保存窗口大小的 XML 文件(如果该文件已存在)。如果该文件不存在,程序会将窗口宽度和高度设置为 600x600。然后将此信息加载到 PropertyGrid 中。现在,我们可以修改 PropertyGrid 中的窗口大小值。单击 SAVE 按钮会将 PropertyGrid 中的信息序列化并将其值保存到磁盘上的 XML 文件中。如果您现在关闭程序然后重新运行它,单击 LOAD 按钮时,您先前输入到 PropertyGrid 中的值将被重新加载并显示。
按照以下步骤创建示例
- 在 VB.NET 2008 中创建一个新项目
- 以设计模式显示您的窗体(名为 Form1)
- 添加一个 PropertyGrid控件
- 添加一个 Button控件并将Text属性更改为 LOAD
- 添加第二个 Button控件并将Text属性更改为 SAVE
现在,切换到代码编辑器并将 Form1 代码从
Class Form
End Class
更改为以下内容
'==============================================
'How to serialize, load and save a class object
'==============================================
Imports System.Xml.Serialization
Imports System.IO
Public Class Form1
    'Load AppSettings
    Dim _appSettings As New AppSettings()
    Private Sub Button1_Click(ByVal sender As System.Object, _
            ByVal e As System.EventArgs) Handles Button1.Click
        _appSettings = AppSettings.Load()
        ' Actually change the form size
        Me.Size = _appSettings.WindowSize
        PropertyGrid1.SelectedObject = _appSettings
    End Sub
    Private Sub Button2_Click(ByVal sender As System.Object, _
            ByVal e As System.EventArgs) Handles Button2.Click
        _appSettings.Save()
    End Sub
End Class
<Serializable()> _
Public Class AppSettings
    Protected _size As System.Drawing.Size
    Public Property WindowSize() As System.Drawing.Size
        Get
            Return _size
        End Get
        Set(ByVal value As System.Drawing.Size)
            _size = value
        End Set
    End Property
    Public Shared Function Load() As AppSettings
        Dim serializer As XmlSerializer = New XmlSerializer(GetType(AppSettings))
        Dim retVal As AppSettings
        Dim reader As TextReader
        Dim fileNotFound As Boolean
        Try
            reader = New StreamReader("MyAppSettings.xml")
        Catch ex As FileNotFoundException
            ' Take the defaults
            fileNotFound = True
        End Try
        If fileNotFound Then
            retVal = New AppSettings
            retVal.WindowSize = New System.Drawing.Size(600, 600)
        Else
            'Read it from the file
            retVal = serializer.Deserialize(reader)
            reader.Close()
        End If
        Return retVal
    End Function
    Public Sub Save()
        Dim serializer As New XmlSerializer(GetType(AppSettings))
        Dim writer As TextWriter = New StreamWriter("MyAppSettings.xml")
        serializer.Serialize(writer, Me)
        writer.Close()
    End Sub
End Class
关注点
上述代码示例主要基于 Christian Lucht 对以下帖子的回复:SDN 软件开发网络。


