道歉,如果这是一个基本问题,但我还在尝试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
内单击标题为“事件日志”的链接标签之前, 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())
不再运行。MAIN NOTE - 我计划每次关闭应用程序时清除事件日志,我会在应用程序关闭时将RichTextBox的内容写入.txt文件。
感谢您的建议,我将非常感谢有关保存字符串/变量以及在表单之间使用它们的一些文档或代码示例。
答案 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
关键字是必需的,以便您可以在定义实例的类中处理实例的事件。
我在这里学到了所有这些:Why is there a default instance of every form in VB.Net but not in C#?