2013-10-29 20 views
0

道歉,如果這是一個基本問題,但我仍在嘗試使用VB.net,並且正在嘗試爲我的測試應用程序創建事件日誌。 (不是Windows事件日誌) - 我專注於一個事件,那就是我的應用程序啓動的時間。存儲和保存表單之間的值VB.net

我有兩種形式,我試圖在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由一個富文本框,其中我將在我的選擇的事件,因爲我構建的應用程序添加文本的宗旨。

現在,當我調試我的應用程序時,單擊我的鏈接標籤測試「Launched @ xx」出現在我的RichTextBox中 - 但是,當我關閉Form2,然後單擊我的LinkLabel時,RichTextBox爲空。

主要問題

  • 我認爲這正在造成的,因爲被加載Form1上時,我產生RichTextBox.Text唯一的一次是。這是一個單獨的實例,關閉/重新打開Form2不會重新加載Form1,因此命令Form2.RichTextBox1.Text = ("Launched @ " & Now.ToShortTimeString())不會再次運行,直到我重新啓動整個應用程序。
  • 我研究了一些答案,如HERE。但使用設置/ XML似乎不是一個明智的選擇,我的意思是時間是一個獨特的價值,我可以使用設置來反映這一點?

主要說明 - 我策劃的事件日誌每次在應用程序關閉時被清除,我會在RichTextBox的內容寫入到應用程序關閉.txt文件。

感謝您的建議,我將不勝感激關於保存字符串/變量和在表單之間使用它們的一些文檔或代碼示例。

+1

我最近回答了一個類似的問題。我的[回覆](http://stackoverflow.com/a/19600774/945456)可能是有幫助的(或者可能不是),看看:) –

回答

0

你在哪裏持有Form2的實例?你應該維護它的全局實例,如果你需要「關閉」它,你應該實際上隱藏它。您可以通過處理Closing事件,並設置事件ARG的「取消」誠然,這此實現這一點:

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

這樣一來,窗體2實例將保持它有任何狀態。通過處理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()」(即引用Show()方法沒有Form2的實例)的建設,並且我瞭解到VB.NET有一個「功能」可以回溯到VB之前的早期版本(這種「功能」從C#中不存在,無論是好的還是壞的):有一種爲每種形式創建的窗體的默認實例在你的應用程序中,這可以讓你調用Form2.Show()。 Show()方法實際上並不是一個靜態方法(儘管它起初對我來說似乎是這樣),它指的是默認實例的Show()方法。

這裏就是我學會了這一切:Why is there a default instance of every form in VB.Net but not in C#?

+0

是不是有點「馬虎」隱藏窗體加載時,他們不需要聲稱更多系統資源等。?看起來你應該避免將它作爲一般的最佳實踐。 –

+0

我不完全確定「當他們不需要時」的意思。你不是在顯示錶格嗎? (因此它是「需要的」)。在我的例子中只有一個表單實例 - 在類級別定義的實例。它是否可見或隱藏不會影響到這一點。它實際上會使用更多的系統資源來關閉表單而不是隱藏它,然後每次都實例化一個新表單。 –

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 
+0

這是否考慮到在加載form1(即應用程序啓動時)時應該記錄時間戳記。加載Form2時不是。 –

+0

@SamN會讓你正確設置,但如果你看看AddLog函數,它會爲每條添加的消息插入當前時間。當應用程序啓動時,只需添加日誌(「啓動」),則無需擁有Form2的實例。 –