0

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

我有两种形式,我正在尝试在Form1和之间建立永久的“链接” Form2。这意味着我可以向关闭/打开表单发送 .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直到在 中单击标题为“事件日志”的链接标签后才会加载Form1Form2对于链接标签上的点击事件,我有一个简单的加载命令。

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 文件。

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

4

2 回答 2

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
于 2013-10-29T13:32:12.997 回答
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() 方法。

这是我学到所有这些的地方:为什么在 VB.Net 中每个表单都有一个默认实例,而在 C# 中却没有?

于 2013-10-29T12:52:53.270 回答