[英]C# Updating TextBox From Another Class
我想要做的就是从另一个类更新textBox(在本例中为txtInit)。 我一直在阅读很多关于UI线程如何改变自己的内容,以及关于使用调度程序的内容。 我在这里找到了一个似乎很接近的答案,但我无法让它为我工作......它说尝试使用这条线:
MainForm.Dispatcher.Invoke(new Action(delegate() {MainForm.myInstance.txtInit.Text = "Text"};);
在我的ServerSide类中,我需要将一个String发送到我的MainForm上的txtInit文本框..这就是我需要做的全部...感谢任何帮助。
类与线程无关(这是你现在的问题)。 每个Control都有一个Invoke方法,它将为您执行正确的线程同步。 所以你可以做到
MainForm.myInstance.txtInit.Invoke((sender, args) => (sender as TextBox).Text = "text");
为了提高性能,您可以测试(基本上告诉您是否在同一个线程中)Control.IsInvokeRequired属性。
另一种方法是使用的SynchronizationContext UI线程的,你需要从SynchronizationContext.Current形式的构造函数来捕获,然后做
syncContext.Send((obj) => MainForm.myInstance.txtInit.Text = "Text", null);
我可能只是在MainForm上创建一个可以传递字符串的公共方法,并让该方法设置文本框的文本。 您还可以控制是否需要我们调用Invoke(不同的线程),这样您就不必担心在其他方面对此进行编码 - 只需调用方法并传递字符串即可。
这是一个例子:
public partial class Form1 : Form
{
public delegate void UpdateText(string text);
public Form1()
{
InitializeComponent();
}
public void SetTextBoxText(string text)
{
// Check to see if invoke required - (from another thread)
if(textBox1.InvokeRequired)
{
textBox1.Invoke(new UpdateText(this.SetTextBoxText),
new object[]{text});
}
else
{
textBox1.Text = text;
}
}
}
如果我理解正确,似乎您想要从另一个线程或某些异步事件访问Windows表单元素。 在这种情况下,以下链接可以帮助您。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.