重定向Console.Write

时间:2018-11-19 22:56:06

标签: vb.net redirect console

我从c#教程的合并中编写了以下代码,这些代码涉及将Console.WriteConsole.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

当该窗口frmDebugLog关闭时,该表单及其文本框内容将被丢弃。

1 个答案:

答案 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中的文本就会持久保存到该字段中。