在表单VB.net之间存储和保持值

时间:2013-10-29 12:32:35

标签: vb.net winforms

道歉,如果这是一个基本问题,但我还在尝试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
Form2内单击标题为“事件日志”的链接标签之前,

Form1未加载。我对链接标签上的点击事件有一个简单的Form2加载命令。

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

        Form2.Show()

    End Sub

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

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

主要问题

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

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

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

2 个答案:

答案 0 :(得分:2)

我个人不会暴露表格的控件。我将在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

答案 1 :(得分:0)

你持有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#?