this.textBox1.Text=" "; 报错c#

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了this.textBox1.Text=" "; 报错c#相关的知识,希望对你有一定的参考价值。

异步处理,不知道怎么让textBox1.Text=" ";接受,报错,代码:
private void button3_Click(object sender, EventArgs e)

Process p = new Process();
p.StartInfo.FileName = "cmd.exe";
//p.StartInfo = new ProcessStartInfo(@"C:\windows\system32\cmd.exe", "dir c:\\");
//p.StartInfo.Arguments = "dir c:\\";
p.StartInfo.UseShellExecute = false;
p.StartInfo.RedirectStandardInput = true;//可能接受来自调用程序的输入信息
p.StartInfo.RedirectStandardOutput = true;//由调用程序获取输出信息
p.StartInfo.CreateNoWindow = true;//不显示程序窗口
p.EnableRaisingEvents = true;

//p.Start();//启动程序
//向CMD窗口发送输入信息:
//string cmd = @"C:\Dropbox\wp\all\ffutool.exe -flash " + @"C:\Dropbox\8916wp\wp8.ffu" + " -force";
//string cmd = @"C:\Dropbox\wp\all\ffutool.exe --list ";
//string cmd = "dir c:\\";
//p.StandardInput.WriteLine(cmd); //10秒后重启(C#中可不好做哦)
p.Start();
p.StandardInput.WriteLine("dir c:\\");
p.OutputDataReceived += new DataReceivedEventHandler(process_OutputDataReceived);

//StreamWriter sortStreamWriter = p.StandardInput;
// 异步获取命令行内容
p.BeginOutputReadLine();
// 为异步获取订阅事件
//sortStreamWriter.Close();
p.StandardInput.WriteLine("exit");
// Wait for the sort process to write the sorted text lines.
p.WaitForExit();
p.Close();

public delegate void OutputDataReceived(Object sender, DataReceivedEventArgs e);
void process_OutputDataReceived(Object sender, DataReceivedEventArgs e)


if (!String.IsNullOrEmpty(e.Data))

//numOutputLines++;

// Add the text to the collected output.
//sortOutput.Append(Environment.NewLine +
// "[" + numOutputLines.ToString() + "] - " + outLine.Data);
//this.textBox1.Text=" ";
//textBox1.AppendText(Environment.NewLine + e.Data.ToString());
MessageBox.Show(Environment.NewLine + e.Data.ToString());
//this.feedback.Text = e.Data.ToString() + Environment.NewLine + this.feedback.Text;



在process_OutputDataReceived方法中,不能访问textbox,报线程访问错误。那怎么才能向textbox里面写内容呢??

参考技术A

不允许子线程操作主线程控件,这是出于安全考虑。

解决有两个方法:

1.窗体Load时候加下面一行代码;

System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls=false;

2.写委托,通过委托操作控件。

追问

想知道委托的具体写法,看着还有点迷糊。

追答

加入下面的代码:

private delegate void SetTextDelegate(string txt);
private void SetText(string txt)

    if (this.textBox1.InvokeRequired)
    
        SetTextDelegate delegate= new SetTextDelegate(SetText);
        this.textBox1.Invoke(delegate, txt);
    
    else
    
        textBox1.Text = txt;
    

将报错的那句textBox1.Text=" ";改为:

string str="要显示的数据";
SetText(str);

本回答被提问者采纳
参考技术B 楼下网友回答正确。我补充下,你要想process_OutputDataReceived里能执行,用 invoke() 的方式来是访问.

if (this.textBox1.InvokeRequired) //这里是表示,如果textBox1不在主线程上,就用委托

this.Invoke(new CallBack(EnableButton)); //EnableButton是一个delegate

else

textBox1.Text = "Enabled";
追问

写到process_OutputDataReceived
if (!String.IsNullOrEmpty(e.Data))这个判断里面吗??CallBack是哪个空间呢?

我的邮箱:590437@163.com.

参考技术C textBox1应该在主线程中,不要再新线程中操作。追问

如果其中有一行需要输出很多的=====================success ,或者===============fail (不止这几个等号,需要执行很长时间,)这一行就不显了,请问这个怎么办啊?

以上是关于this.textBox1.Text=" "; 报错c#的主要内容,如果未能解决你的问题,请参考以下文章

c#中 Double num1 = Convert.ToDouble(this.textBox1.Text.ToString())是啥意思,里面的()是啥意思

C# streamwriter方法写入汉字时乱码

正则表达式怎么来验证输入框中只能输入整数而且不能以0开头;就是不能输入001这样的数字;

wpf怎么给textbox的text属性指定默认值

在C#中注册页面如何判断用户名和密码为空

winform中为啥return后还继续执行?