2015-09-19 240 views
0

该代码用于使用VB.NET运行CMD。我想要做的是,当我输入“ipconfig”并单击ExecuteButton时,将出现大量文本,其中一个单词将是“DNS”。当OutputTextBox中出现“DNS”这个词时,我希望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 

这里是什么样子的例子:

http://s7.postimg.org/uj7xcykm1/form1.png

要指出我的问题,这里是我尝试做:

If OutputTextBox.Text = "DNS" Then 
    StatusTextBox.Text = "It Works" 
End If 

当我输入“ipconfig”时,将显示文本“DNS”,但不显示StatusTextBox发生了一件事情。我究竟做错了什么?

回答

0

表单Load事件是从来没有等待,所以它会立即检查你的条件语句。你可以将条件语句移动到OutputDataReceived Sub吗?

此外,您OutputTextBox正在添加数据,所以我不能看到它永远等于“DNS”。您是否在查看它是否包含(“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 
+0

是的,你说得对,我要检查它是否包含“DNS”,然后有“这作品”在StatusTextBox显示。 你的意思是像下面那样吗?它不适合我。 私人小组MyProcess_OutputDataReceived(BYVAL发件人为对象,BYVALË作为System.Diagnostics.DataReceivedEventArgs)把手MyProcess.OutputDataReceived AppendOutputText(vbCrLf&e.Data) 如果e.Data.Contains( “DNS”)然后 StatusTextBox.Text =“它工作的” 结束如果 结束小组 – luoxiansheng

+0

通过“它没有为我工作”你的意思是你得到一个错误约一个跨线程操作?您需要创建一个用于访问UI的委托,就像您更改输出文本框一样。我在上面添加了一些代码。 – Capellan

+0

对不起,我的短暂没有工作的答案,我应该早些时候更详细。但是,你是非常正确的,这是我收到的错误。代表确实解决了这个问题。非常感谢! :) – luoxiansheng

相关问题