在从另一个类操作richtextbox时遇到问题
使用backgroundworker类从计算线程中分离GUI线程
这是我需要从其他类
调用的函数public void UpdateRTB(String strText, Color colVar)
{
if (InputBox.InvokeRequired)
{
InputBox.Invoke(new UpdateRTBCallback(this.UpdateRTB), new object[] { strText, colVar });
}
else
{
InputBox.Select(InputBox.Text.IndexOf(strText), strText.Length);
InputBox.SelectionColor = colVar;
InputBox.Update();
}
}
变量objForm1是在将表单初始化为
之后声明的变量objForm1 = this;
返回表单的函数是
public static Form1 GetThisForm()
{
return objForm1;
}
这是我的全局声明的委托
public delegate void UpdateRTBCallback(String strText, Color strColor);
这是代码在另一个类中编写来调用它
Form1 form1 = Form1.GetThisForm();
form1.UpdateRTB(item, Color.Yellow);
在objForm1中,当我调试时,我看到它的字段显示System.InvalidOperationException ..这是我做错了什么的问题 请帮忙!!!
答案 0 :(得分:1)
你不能直接从另一个线程操作gui线程,你需要检查InvokeRequired并调用如果从另一个线程调用gui线程上的方法。在你的gui类实现方法中,你期望从其他线程使用InvokeRequired调用,以检查是否需要在gui线程上调用操作或继续正常。这个主题有很多信息here。这是一个非常简短的演示:
if (this.InvokeRequired) {
// called from non-gui thread, use invoke to delegate the action to the gui thread
MyCallBack callback = new MyCallBack(myCallBack);
this.Invoke(callback, params);
} else {
// called from gui thread, do your thing as normal
}
答案 1 :(得分:0)
无论如何,这里有一些替代方案我希望对你有用的答案/选项 - >您可能希望查看这些有用的帮助程序属性,而不是编写自己的帮助程序属性,这些属性似乎已经执行了您需要的Form.ActiveForm或Application.OpenForms。
PS:System.InvalidOperation可能会显示您的表单的字段,因为它们也是从另一个(调试)线程评估而不是UI线程。