【问题标题】:Storing and keeping values between forms VB.net在 VB.net 表单之间存储和保存值
【发布时间】:2013-11-08 14:42:59
【问题描述】:

抱歉,如果这是一个基本问题,但我仍在尝试使用 VB.net,并且我正在尝试为我的测试应用程序创建事件日志。 (不是 Windows 事件日志) - 我只关注一个事件,即我的应用程序启动的时间。

我有两个表格,我正在尝试在Form1Form2 之间建立一个永久的“链接”。这意味着我可以将 .NET 命令和变量发送到 Form2,并且在关闭/打开表单时,数据会一直保留到主应用程序 Form1 关闭。

以下面我运行的代码为例,Form1 已加载。

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load

        Form2.RichTextBox1.Text = ("Launched @ " & Now.ToShortTimeString())

    End Sub

Form1 中单击标题为“事件日志”的链接标签之前,不会加载Form2。我有一个简单的Form2 加载命令,用于链接标签上的点击事件。

Private Sub LinkLabel1_LinkClicked(sender As Object, e As LinkLabelLinkClickedEventArgs) Handles LinkLabel1.LinkClicked

        Form2.Show()

    End Sub

Form2 由一个 RichText 框组成,我将在构建应用程序时为我选择的事件添加文本。

现在,当我调试我的应用程序时,我单击链接标签,测试“Launched @ xx”出现在我的 RichTextBox 中 - 但是当我关闭 Form2 然后单击我的 LinkLabel 时,RichTextBox 是空白的。

主要问题

  • 我认为这是因为我生成RichTextBox.Text 的唯一时间是加载Form1 时。这是一个单一的实例,关闭/重新打开 Form2 不会重新加载 Form1,因此在我重新启动整个应用程序之前不会再次运行命令 Form2.RichTextBox1.Text = ("Launched @ " & Now.ToShortTimeString())
  • 我研究了一些答案,例如HERE。但是使用设置/XML 似乎不是一个明智的选择,我的意思是时间是一个唯一值,我可以使用设置来反映这一点吗?

主要说明 - 我计划在每次关闭应用程序时清除事件日志,我将在应用程序关闭时将 RichTextBox 的内容写入 .txt 文件。

感谢您的建议,我将不胜感激一些有关保存字符串/变量并在表单之间使用它们的文档或代码示例。

【问题讨论】:

  • 我最近回答了一个类似的问题。我的answer 可能有帮助(也可能没有),看看:)

标签: vb.net winforms


【解决方案1】:

就我个人而言,我不会公开表单的控件。我会在 form2 中创建一个函数来设置文本。

Form2.SetText("Launched @ " & Now.ToShortTimeString())

您可以创建一个类来存储您的日志。这个类可以存储在Form1中。

在显示Form2之前,您可以设置日志。

Private Sub LinkLabel1_LinkClicked(sender As Object, e As LinkLabelLinkClickedEventArgs) Handles LinkLabel1.LinkClicked
    Form2.SetLogs(LogObject)
    Form2.Show()
End Sub

这个函数会获取日志类的内容并输出到RichTextBox

日志类可能如下所示。

Public Class Log

    Private _logs As New List(Of String)

    Public Sub Clear()
        _logs.Clear()
    End Sub

    Public Sub AddLog(ByVal message As String)
        _logs.Add(DateTime.Now.ToString() & " " & message)
    End Sub

    Public Function GetLogs() As String
        Return String.Join(vbCrLf, _logs.ToArray())
    End Function

End Class

【讨论】:

  • 这是否考虑到在加载 form1 时(即启动应用程序)而不是在加载 Form2 时记录时间戳。
  • @SamN 供您正确设置,但如果您查看 AddLog 函数,它会为添加的每条消息插入当前时间。应用启动时,只需AddLog("Launched"),不需要Form2的实例。
【解决方案2】:

你在哪里持有 Form2 的实例?你应该维护它的一个全局实例,如果你需要“关闭”它,你实际上应该只是隐藏它。您可以通过处理 Closing 事件并将事件 arg 的“取消”设置为 True 来完成此操作,如下:

Private Sub Form1_FormClosing(sender As Object, e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
    e.Cancel = True
    Me.Hide()
End Sub

这样,Form2 实例将保持它拥有的任何状态。通过处理 FormClosing 事件并将 arg 的 Cancel 属性设置为 true,您就是在告诉应用程序有效地停止关闭表单。这意味着您实际上可以关闭表单的任何方法(Alt + 4、红色的“X”等)都不会关闭它,而是隐藏它。

编辑:我没有意识到您实际上可以显示您从未实例化的表单(即“Form.Show()”方法是静态方法)。因此,当我在上面询问您将 Form2 的实例保存在哪里时,我的意思是您应该在 Form1 加载时创建一个 Form2 的全局实例,并始终使用该实例。见下文:

Private WithEvents frm As Form2 'My global instance.

Private Sub Form1_Load(sender As Object, e As System.EventArgs) Handles Me.Load
    frm = New Form2
End Sub

Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    Me.frm.Show()
End Sub

Private Sub frm_FormClosing(sender As Object, e As System.Windows.Forms.FormClosingEventArgs) Handles frm.FormClosing
    e.Cancel = True
    frm.Hide()
End Sub

请注意,WithEvents 关键字是必需的,以便您可以在定义实例的类中处理实例的事件。

编辑:我对为什么可以使用“Form2.Show()”之类的结构进行了一些研究(即参考没有 Form2 实例的 Show() 方法),我了解到 VB.NET 有一个“功能”可以追溯到 VB 的早期——在 .NET 之前(无论好坏,C# 中都没有这个“功能”):为您拥有的每个表单创建了一个默认的表单实例您的应用程序,这就是允许您调用 Form2.Show() 的原因。 Show() 方法实际上并不是一个静态方法(虽然一开始对我来说是这样的),它指的是默认实例的 Show() 方法。

这是我学到所有这些的地方:Why is there a default instance of every form in VB.Net but not in C#?

【讨论】:

  • 在不需要占用更多系统资源等的情况下加载隐藏表单是不是有点“草率”?作为一般的最佳实践,您似乎应该避免这样做。
  • 我不完全确定您所说的“不需要它们时”是什么意思。你不显示表格吗? (因此它是“需要的”)。在我的示例中只有一个表单实例——在类级别定义的实例。它是可见的还是隐藏的都不会影响这一点。它实际上会使用更多的系统资源来关闭表单而不是隐藏它,然后每次都实例化一个新的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多