winforms - 从 Backgroundworker DoWork 访问窗口控制

标签 winforms backgroundworker

我的问题如下:

我有一个窗口窗体,其中放置了一个 LayoutPanel,当窗体加载时,多个控件,如:文本框和标签被添加到 LayoutPanel。

然后单击按钮,我需要处理用户在那些动态创建的控件上输入的数据。为此,我使用了一个 Backgroundworker,它应该可以获取这些控件并读取它们的数据。

我的问题是 Backgroundworker 不允许我从 DoWork 方法访问控件,但我需要这样做,因为我将报告操作的进度。

以下是我的代码的一部分,以澄清这个概念:

private void frmMyForm_Load(object sender, EventArgs e)
    {
       //I add multiple controls, this one is just for example
       LayoutPanel1.add(TextBox1);

       ....
    }

private void bgwBackground_DoWork(object sender, DoWorkEventArgs e)
    {

       foreach (Control controlOut in LayoutPanel1.Controls)
       {
           //do some stuff, this one is just for example
           string myString = controlOut.Name; //-> Here is the error, cant access controls from different Thread.
       }
    }

使用委托(delegate)设置文本很简单,但是让整个父控件操作子控件怎么样(只是为了获取信息,我不想设置任何数据,只需要获取名称,文本,类似的东西) .

希望我说清楚了,谢谢大家。

最佳答案

您只能从 GUI 线程访问 Windows 窗体控件。如果你想从另一个线程操作它们,你需要使用 Control.Invoke传递委托(delegate)以在 GUI 线程上执行的方法。在您的情况下,您应该能够做到这一点:

private void bgwBackground_DoWork(object sender, DoWorkEventArgs e)
{
    foreach (Control controlOut in LayoutPanel1.Controls)
    {
        this.Invoke(new MethodInvoker(delegate {
            // Execute the following code on the GUI thread.
            string myString = controlOut.Name;
        }));
    }
}

我喜欢定义一个允许我使用更简洁的 lambda 语法的扩展方法:
// Extension method.
internal static void Invoke(this Control control, Action action) {
    control.Invoke(action);
}

// Code elsewhere.
this.Invoke(() => {
    string myString = controlOut.Name;
});

关于winforms - 从 Backgroundworker DoWork 访问窗口控制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3463206/

相关文章:

c# - 如何为 Windows 窗体中的文本框分配快捷键(如 Ctrl+F)?

c# - 后台 worker ReportProgress 方法

WPF:如何调用 Dispatcher.BeginInvoke *only* 当队列中没有要调用的内容时?

c# - BackgroundWorker 进程需要引发要在主 (UI) 线程上处理的自定义事件

.net - OpenGL 是否可以使用 .NET 形式?

c# - dataGridView "remove empty rows"- 按钮

c# - DevExpress GridView.SaveLayoutToStream 不保存 FindFilterText

c# - ControlDesigner 类 (C# WinForms)

vb.net - 将值从 BackgroundWorker DoWork 传递到 BackgroundWorker Completed

c# - 如何使用后台 worker 将参数(字符串)发送到 UI 线程?