首页 > 解决方案 > 使用 DataReceivedEventHandler 函数中的字符串更新主窗体的文本框控件?

问题描述

我正在使用微软的示例使用异步方法处理标准输出和标准错误: https ://docs.microsoft.com/en-us/dotnet/api/system.diagnostics.datareceivedeventhandler?view=net-5.0

但是,如何在主窗体中更新文本框的文本属性?因为,它不允许线程在另一个线程中更新控制。即,我希望下面的这个处理程序更新 frmMain.txtBox1.text 以在文本框中显示标准输出日志。

    private static void SortOutputHandler(object sendingProcess,
        DataReceivedEventArgs outLine)
    {
        // Collect the sort command output.
        if (!String.IsNullOrEmpty(outLine.Data))
        {
            numOutputLines++;

            // Add the text to the collected output.
            sortOutput.Append(Environment.NewLine +
                $"[{numOutputLines}] - {outLine.Data}");
        }
    }

标签: c#winforms

解决方案


假设frmMain是一个有效的实例(并指向屏幕上已经显示的表单),并且txtBox1它的 modifiers 属性已更改为 public 因此它是可见的,您可以执行以下操作:

frmMain.txtBox1.Invoke((MethodInvoker) delegate {
    // ... put code in here ...
});

如果 frmMain 实际上是您的表单的类型名称,您需要获取对显示在屏幕上的 frmMain 实际实例的引用。有多种方法可以做到这一点,包括迭代打开的表单,或者可能事先从其他地方传入该实例。


推荐阅读