C# 从另一个类更新文本框
本文关键字:文本 更新 另一个 | 更新日期: 2023-09-27 18:31:42
我要做的就是从另一个类更新文本框(在本例中为 txtInit)。我一直在阅读很多关于 UI 线程必须如何改变自身的信息,以及有关使用调度程序的信息。我在这里找到了一个似乎很接近的答案,但我无法让它为我工作......它说尝试使用这条线:
MainForm.Dispatcher.Invoke(new Action(delegate() {MainForm.myInstance.txtInit.Text = "Text"};);
在我的ServerSide类中,我需要向MainForm上的txtInit文本框发送一个字符串......这就是我需要做的......感谢任何帮助。
类
与线程无关(这是你现在的问题)。每个控件都有一个 Invoke 方法,该方法将为您执行正确的线程同步。所以你可以做
MainForm.myInstance.txtInit.Invoke((sender, args) => (sender as TextBox).Text = "text");
为了提高性能,您可以测试(基本上告诉您是否在同一线程中)Control.IsInvokeRequired 属性。
另一种方法是使用 UI 线程的 SynchronizationContext,您需要在窗体的构造函数中从 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 表单元素。在这种情况下,以下链接可能会对您有所帮助。
-
http://msdn.microsoft.com/en-us/library/ms171728.aspx
-
从多个工作线程更新 UI (.NET)
-
在 Windows Mobile 中控制来自不同线程的表单元素