我从c#教程的合并中编写了以下代码,这些代码涉及将Console.Write
或Console.WriteLine
重定向到文本框文本字段。我意识到这很不好,因为如果我调用任何一种.Close()
方法都会删除文本框,这与我想做的相反。
Imports System.Text
Imports System.IO
Namespace ConsoleRedirection
Public Class TextBoxStreamWriter
Inherits TextWriter
Private _output As TextBox = Nothing
Public Sub New(ByVal output As TextBox)
_output = output
End Sub
Public Overrides Sub WriteLine(ByVal value As String)
MyBase.WriteLine(value)
_output.AppendText(String.Format("[{0}] {1}" + vbNewLine, DateTime.Now, value.ToString()))
End Sub
Public Overrides ReadOnly Property Encoding As Encoding
Get
Return System.Text.Encoding.UTF8
End Get
End Property
End Class
End Namespace
无论如何,除了加载文本文件之外,我还可以将所有控制台输出重定向到一个文本框吗?
回答评论中的问题。 (此代码最初在这里找到:https://saezndaree.wordpress.com/2009/03/29/how-to-redirect-the-consoles-output-to-a-textbox-in-c/ ...但是已转换为VB)
以另一种形式,通过声明TextWriter来调用代码。
Private _writer As TextWriter = New TextBoxStreamWriter(frmDebugLog.txtDebugLog)
然后作为父表单的.Load
的一部分:
Console.SetOut(_writer)
在表单的后面,使用frmDebugLog.Show()
当该窗口frmDebugLog
关闭时,该表单及其文本框内容将被丢弃。
答案 0 :(得分:2)
似乎您正在使用默认实例,因此一次只能使用一个实例。在这种情况下,这可以完成工作:
Private Shared txtDebugLogText As String
Public Sub New()
' This call is required by the designer.
InitializeComponent()
' Add any initialization after the InitializeComponent() call.
txtDebugLog.Text = txtDebugLogText
End Sub
Protected Overrides Sub OnFormClosed(e As FormClosedEventArgs)
txtDebugLogText = txtDebugLog.Text
MyBase.OnFormClosed(e)
End Sub
通过使用Shared
字段,您可以将所有内容都保留在一个类中。每当创建新实例时,该字段的当前值就会首先加载到TextBox
中,而每当实例被销毁时,当前TextBox
中的文本就会持久保存到该字段中。