如何将文本从一个文本框显示到另一个文本框
how to display text from one textbox into another one
该代码用于使用VB.NET到运行 CMD。我想要做的是,当我输入 "ipconfig" 并单击 ExecuteButton 时,会出现很多文本,其中一个是 "DNS"。当 "DNS" 一词出现在 OutputTextBox 中时,我希望 StatusTextBox 显示文本 "It Works".
代码如下:
Public Class Form1
Private WithEvents MyProcess As Process
Private Delegate Sub AppendOutputTextDelegate(ByVal text As String)
Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
Me.AcceptButton = ExecuteButton
MyProcess = New Process
With MyProcess.StartInfo
.FileName = "CMD.EXE"
.UseShellExecute = False
.CreateNoWindow = True
.RedirectStandardInput = True
.RedirectStandardOutput = True
.RedirectStandardError = True
End With
MyProcess.Start()
MyProcess.BeginErrorReadLine()
MyProcess.BeginOutputReadLine()
AppendOutputText("Process Started at: " & MyProcess.StartTime.ToString)
If OutputTextBox.Text = "DNS" Then
StatusTextBox.Text = "It Works"
End If
End Sub
Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
MyProcess.StandardInput.WriteLine("EXIT")
MyProcess.StandardInput.Flush()
MyProcess.Close()
End Sub
Private Sub MyProcess_ErrorDataReceived(ByVal sender As Object, ByVal e As System.Diagnostics.DataReceivedEventArgs) Handles MyProcess.ErrorDataReceived
AppendOutputText(vbCrLf & "Error: " & e.Data)
End Sub
Private Sub MyProcess_OutputDataReceived(ByVal sender As Object, ByVal e As System.Diagnostics.DataReceivedEventArgs) Handles MyProcess.OutputDataReceived
AppendOutputText(vbCrLf & e.Data)
End Sub
Private Sub ExecuteButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ExecuteButton.Click
MyProcess.StandardInput.WriteLine(InputTextBox.Text)
MyProcess.StandardInput.Flush()
InputTextBox.Text = ""
End Sub
Private Sub AppendOutputText(ByVal text As String)
If OutputTextBox.InvokeRequired Then
Dim myDelegate As New AppendOutputTextDelegate(AddressOf AppendOutputText)
Me.Invoke(myDelegate, text)
Else
OutputTextBox.AppendText(text)
End If
End Sub
End Class
这是它的外观示例:
为了指出我的问题,这是我尝试做的事情:
If OutputTextBox.Text = "DNS" Then
StatusTextBox.Text = "It Works"
End If
当我输入 "ipconfig" 时,文本 "DNS" 会出现,但 StatusTextBox 没有任何反应。我做错了什么?
您的表单加载事件永远不会等待,因此它会立即检查您的条件语句。您可以将条件语句移动到您的 OutputDataReceived Sub 吗?
此外,您的 OutputTextBox 正在附加数据,因此我看不到它等于 "DNS"。您是否要查看它是否包含 .Contains("DNS")?
如果您将条件移动到 OutputDataReceived,并且附加到 OutputTextBox,您是否只想查看是否 e.Data.Contains("DNS")?
-- 编辑--
Private Delegate Sub ChangeStatusTextDelegate(ByVal text As String)
Private Sub MyProcess_OutputDataReceived(ByVal sender As Object, ByVal e As System.Diagnostics.DataReceivedEventArgs) Handles MyProcess.OutputDataReceived
AppendOutputText(vbCrLf & e.Data)
If e.Data.Contains("DNS") Then
ChangeStatusText("It works")
End If
End Sub
Private Sub ChangeStatusText(ByVal text As String)
If txtStatus.InvokeRequired Then
Dim myDelegate As New ChangeStatusTextDelegate(AddressOf ChangeStatusText)
Me.Invoke(myDelegate, text)
Else
Me.StatusTextBox.Text = text
End If
End Sub
该代码用于使用VB.NET到运行 CMD。我想要做的是,当我输入 "ipconfig" 并单击 ExecuteButton 时,会出现很多文本,其中一个是 "DNS"。当 "DNS" 一词出现在 OutputTextBox 中时,我希望 StatusTextBox 显示文本 "It Works".
代码如下:
Public Class Form1
Private WithEvents MyProcess As Process
Private Delegate Sub AppendOutputTextDelegate(ByVal text As String)
Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
Me.AcceptButton = ExecuteButton
MyProcess = New Process
With MyProcess.StartInfo
.FileName = "CMD.EXE"
.UseShellExecute = False
.CreateNoWindow = True
.RedirectStandardInput = True
.RedirectStandardOutput = True
.RedirectStandardError = True
End With
MyProcess.Start()
MyProcess.BeginErrorReadLine()
MyProcess.BeginOutputReadLine()
AppendOutputText("Process Started at: " & MyProcess.StartTime.ToString)
If OutputTextBox.Text = "DNS" Then
StatusTextBox.Text = "It Works"
End If
End Sub
Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
MyProcess.StandardInput.WriteLine("EXIT")
MyProcess.StandardInput.Flush()
MyProcess.Close()
End Sub
Private Sub MyProcess_ErrorDataReceived(ByVal sender As Object, ByVal e As System.Diagnostics.DataReceivedEventArgs) Handles MyProcess.ErrorDataReceived
AppendOutputText(vbCrLf & "Error: " & e.Data)
End Sub
Private Sub MyProcess_OutputDataReceived(ByVal sender As Object, ByVal e As System.Diagnostics.DataReceivedEventArgs) Handles MyProcess.OutputDataReceived
AppendOutputText(vbCrLf & e.Data)
End Sub
Private Sub ExecuteButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ExecuteButton.Click
MyProcess.StandardInput.WriteLine(InputTextBox.Text)
MyProcess.StandardInput.Flush()
InputTextBox.Text = ""
End Sub
Private Sub AppendOutputText(ByVal text As String)
If OutputTextBox.InvokeRequired Then
Dim myDelegate As New AppendOutputTextDelegate(AddressOf AppendOutputText)
Me.Invoke(myDelegate, text)
Else
OutputTextBox.AppendText(text)
End If
End Sub
End Class
这是它的外观示例:
为了指出我的问题,这是我尝试做的事情:
If OutputTextBox.Text = "DNS" Then
StatusTextBox.Text = "It Works"
End If
当我输入 "ipconfig" 时,文本 "DNS" 会出现,但 StatusTextBox 没有任何反应。我做错了什么?
您的表单加载事件永远不会等待,因此它会立即检查您的条件语句。您可以将条件语句移动到您的 OutputDataReceived Sub 吗?
此外,您的 OutputTextBox 正在附加数据,因此我看不到它等于 "DNS"。您是否要查看它是否包含 .Contains("DNS")?
如果您将条件移动到 OutputDataReceived,并且附加到 OutputTextBox,您是否只想查看是否 e.Data.Contains("DNS")?
-- 编辑--
Private Delegate Sub ChangeStatusTextDelegate(ByVal text As String)
Private Sub MyProcess_OutputDataReceived(ByVal sender As Object, ByVal e As System.Diagnostics.DataReceivedEventArgs) Handles MyProcess.OutputDataReceived
AppendOutputText(vbCrLf & e.Data)
If e.Data.Contains("DNS") Then
ChangeStatusText("It works")
End If
End Sub
Private Sub ChangeStatusText(ByVal text As String)
If txtStatus.InvokeRequired Then
Dim myDelegate As New ChangeStatusTextDelegate(AddressOf ChangeStatusText)
Me.Invoke(myDelegate, text)
Else
Me.StatusTextBox.Text = text
End If
End Sub