从 C# 上的函数处理程序访问表单控件

Posted

技术标签:

【中文标题】从 C# 上的函数处理程序访问表单控件【英文标题】:Accessing forms control from function handler on C# 【发布时间】:2018-05-19 10:22:57 【问题描述】:

我在 C# 上创建了一个交互式 shell,但我不知道如何访问我的表单控件并将接收到的值分配给我的文本框,我知道线程无法访问 UI 线程,但在这种情况下,我不知道'似乎无法解决问题,该外壳中将有很多输入和输出,我想确保向用户显示所有内容。

 public partial class Form1 : Form
    
        public Form1()
        
            InitializeComponent();
        

        private void button1_Click(object sender, EventArgs e)
        
            Process process = new Process();
            process.StartInfo.FileName = "echoo.exe";
            process.StartInfo.Arguments = "";
            process.StartInfo.UseShellExecute = false;
            process.StartInfo.RedirectStandardOutput = true;
            process.StartInfo.RedirectStandardError = true;


            process.ErrorDataReceived += new DataReceivedEventHandler(OutputHandler);

            process.StartInfo.RedirectStandardInput = true;

            process.Start();

            StreamWriter sw = process.StandardInput;

            process.BeginOutputReadLine();
            process.BeginErrorReadLine();

            sw.WriteLine("sent");
            process.WaitForExit();

        
        static void OutputHandler(object sendingProcess, DataReceivedEventArgs outLine)
        

            Form1.textBox1.Text = outLine.Data;
        


    

【问题讨论】:

【参考方案1】:

如果你在你的 setter 中写这个:

static void OutputHandler(object sendingProcess, DataReceivedEventArgs outLine)

    if(textBox1.InvokeRequired)
    
        textBox1.BeginInvoke((MethodInvoker) delegate() textBox1.Text = outLine.Data;);    
    
    else
    
        textBox1.Text = outLine.Data;
    

它将强制设置到 UI 线程。我从这个问题中找到了这个:stack question

【讨论】:

错误:非静态字段、方法或属性“Form1.textBox1”需要对象引用 哦哈哈,您已经在 Form1 类中了。只需从文本框变量中删除 Form1.。更新了答案。 同样的错误再次发生,这次我删除了 static 和 process.WaitForExit(); 因为这会阻止 ui 处理分配,我猜它现在可以工作了,谢谢。

以上是关于从 C# 上的函数处理程序访问表单控件的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C# 中访问查找所有控件和所有组件到表单中?

如何在 C# 中访问查找所有控件和所有组件到表单中?

C# 中窗体的 Control 属性中的控件顺序

访问表单控件闪烁控件是来自Class的setFocus

Visual C# 更改控件上的图像会产生异常

如何同时为单个表单上的两个不同控件设置两种不同的文化?