【问题标题】:Accessing text box from other thread从其他线程访问文本框
【发布时间】:2013-02-07 10:45:19
【问题描述】:

我正在使用以下代码从另一个线程将文本写入文本框

delegate void SetTextCallback(string text);
private void SetText1(string text)
    {
        if (this.textBox7.InvokeRequired)
        {
            SetTextCallback d = new SetTextCallback(SetText1);
            this.Invoke(d, new object[] { text});
        }
        else
        {
            this.textBox7.Text = text;
        }
}

现在我必须将文本写入多个文本框(例如 textBox8、9、10)。我想要同样的功能 SetText1 工作。那么有没有办法让我在这个函数中创建 textBox7 变量并使用我打算从另一个线程编写的文本框。

否则,如果我遵循我目前的方法,那么如果我想写入十个文本框,我将需要十个 SetText 函数

【问题讨论】:

  • 为什么不将TextBox 传递给代表?
  • 我不明白。 this.Invoke 在这里做什么? InvokeControl 方法。通常后台线程引用控件作为线程创建参数,然后在控件上调用Invoke。现在,如果您在线程中拥有控制权并在其上调用 Invoke,那么您已经知道您处理调用的控制权是什么。
  • 非常感谢,它有帮助!

标签: c# textbox


【解决方案1】:

你可以只用一个函数来做——你甚至不需要委托

 private void SetText(TextBox txt, string text)
    {
        if (txt.InvokeRequired)
        {
           Invoke((MethodInvoker)(() => txt.Text = text));
        }
        else
        {
            txt.Text = text;
        }
    }

【讨论】:

  • 我们在这里讨论的是哪个命名空间 Invoke() 方法?在 2019 年,它不会自动识别引用,也不会提供任何关于命名空间的建议。搜索未显示任何看起来完全匹配的内容。我正在尝试从 ProgressChangedEventHandler 中写入 RichTextBox。
  • this.Invoke - 所以形式(虽然定义实际上是 Control 中的几个基类)
【解决方案2】:
delegate void SetTextCallback(TextBox textBox, string text);
private void SetText(TextBox textBox, string text)
{
    if (textBox.InvokeRequired)
    {
        SetTextCallback d = new SetTextCallback(SetText);
        this.Invoke(d, new object[] {textBox, text});
    }
    else
    {
        textBox.Text = text;
    }
}

【讨论】:

    猜你喜欢
    • 2012-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多