【问题标题】:Alternative method to save data than my.settings for VB.Net保存数据的替代方法比 VB.Net 的 my.settings
【发布时间】:2015-06-20 12:12:52
【问题描述】:

我需要为 Windows 窗体应用程序保存大约 1600 条不同的信息

解决此问题的最佳方法是什么?例如,一些用户设置看起来像这样measuringItem1NamemeasuringItem1EquationmeasuringItem1EnabledmeasuringItem1OffsetmeasuringItem2Name...

我查看了 my.settings,但是,我发现输入每个用户设置会非常乏味且容易出错。

似乎最好的解决方案是拥有一种可以访问每个单独的单元格并编辑该信息的表格。

这样的东西存在吗?如果是这样,如何用 VB.Net 实现它?

【问题讨论】:

  • 这是一个多用户应用程序吗?如果是这样,一个用户设置的值是否应该对另一个用户可见?这是一个网站、winforms、wpf 应用程序吗?
  • @ZoharPeled 这是一个 Windows 窗体应用程序。通常只有一个用户,但其他用户使用相同设置的能力将是一个奖励。
  • 我在你的帖子里看到了measuringItem1Name...measuringItem2Name...。我猜你的每个measurementItem 的数据点数量有限,但是要处理很多measurementItem,对吗?
  • @ZoharPeled 这或多或少是正确的。将有 16 种不同的潜在测量项目。每个项目都将具有用于计算它们的各种设置,包括将使用哪些传感器、各个方程、名称等。实际测量值将存储在其他地方。我只需要一个存储用户设置的好方法。

标签: database vb.net


【解决方案1】:

我建议创建一个具有属性的类来保存您的设置。将类标记为可序列化。然后序列化和反序列化这个类的一个实例作为应用程序启动/关闭到用户的配置文件目录。如果您需要该选项,这将允许您拥有每个用户单独保存的强类型设置。它还允许您轻松设置设置的默认值。

您可以根据需要将“设置”类设置为任意深度,其属性由其他子设置类或按索引的设置列表组成。这是一个非常强大的模式。

例如:

settings.MeasuringItem(1).Enabled = True
settings.MeasuringItem(1).Equation = "1+1"
settings.MeasuringItem(1).Offset = 15

settings.MeasuringItem(2).Enabled = True
settings.MeasuringItem(2).Equation = "1+1"
settings.MeasuringItem(2).Offset = 15

Settings 是带有Generic.List(of MeasuringItem) 属性的主要设置类。 MeasuingItem 是另一个类,上面有 .Enabled As Boolean.Equation as string 等属性。

我还没有真正检查过这个错误。您需要做更多的安全检查,但这应该可以帮助您开始。

<Serializable>
Public Class Settings

    Public Sub New()
        _measuringItems = New List(Of MeasuringItem)
    End Sub

    Private _measuringItems As List(Of MeasuringItem)
    Public ReadOnly Property MeasuringItems As List(Of MeasuringItem)
        Get
            Return _measuringItems
        End Get
    End Property

    Public Sub Save()
        Using s As New IO.FileStream("Path to save", IO.FileMode.Create)

            Dim formatter As New System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
            formatter.Serialize(s, Me)
        End Using
    End Sub

    Public Shared Function Load() As Settings
        Dim settings As Settings = Nothing

        Using s As New IO.FileStream("Path to load", IO.FileMode.Open)

            Dim formatter As New System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
            settings = CType(formatter.Deserialize(s), ServerHost.Settings)
        End Using
        Return settings
    End Function


End Class

<Serializable>
Public Class MeasuringItem
    Public Property Enabled As Boolean = True 'These are the default values
    Public Property Equation As String = "1+1"
    Public Property Offset As Integer = 15
End Class

一个简单的用法示例:

    'Create a completely new settings instance with 100 measuring items
    Dim settings1 As Settings = New Settings
    For i As Integer = 1 To 100
        settings1.MeasuringItems.Add(New MeasuringItem)
    Next
    settings1.MeasuringItems(0).Enabled = False
    settings1.MeasuringItems(5).Equation = "testing"

    'Save it
    settings1.Save()

    'load the saved settings
    Dim settings2 As Settings = Settings.Load

【讨论】:

  • 您能否提供示例代码以说明如何针对简单案例实现此功能?
  • 好的,给我几分钟。
  • 对不起。也许我太菜鸟了。我在初始化类和实际保存对类的更改时遇到问题。您需要调用什么代码来执行此操作?
  • 添加了一些示例用法
【解决方案2】:

我建议使用数据库来存储值。我不了解您的操作环境(例如,我有几个企业 SQL 服务器可供使用。)您可以使用免费的 SQL Express Edition . SQL Lite 也是一个选项。您甚至可以使用 Access,但这需要安装 MS Office。

如果你不想走数据库路线,你可以创建一个设置类,并使该类可序列化。这会将对象序列化为二进制文件或 XML 文件(取决于您如何设置它。)如果您想采用这种方法,我会为您发布代码。

【讨论】:

  • 如果我要使用 Sql Server Express,我的安装文件是否也必须包含 Sql Server?对不起,我从来没有使用过数据库。
  • 如果您要分发软件,您也必须分发该软件。我不知道 SQL Express 的许可证是否允许您将其与安装程序捆绑在一起,但我怀疑 SQL Lite 会。
  • 是否可以使用 SQL Express 或 SQL Lite 制作 3D 表?
  • 通过 3D,如果您指的是在数据库中存储多维数据(即存储为数组),那么可以。您可以利用多种技术,例如stackoverflow.com/questions/25271827/…。如果您在谈论另一种数据存储类型,那么我不确定。
  • 如果您要处理数千个要保存的变量,我很想创建一个列出所有这些变量的表和另一个数据表,并将它们链接起来。这使您的设计更灵活,更容易添加和删除配置数据。然后,您可以构建一个表单来修改这些值。
猜你喜欢
  • 2012-08-15
  • 1970-01-01
  • 1970-01-01
  • 2018-12-11
  • 2011-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多