我有一个表单(MainPage
)并且我在其中设置了一个UserControl
,所以我按照这样的形式编写一个方法来调用:
delegate void containerPanelCallback(UIPart uiPart);
public void IncludeUIPart(UIPart uiPart)
{
if (this.containerPanel.InvokeRequired)
{
containerPanelCallback d = new containerPanelCallback(IncludeUIPart);
containerPanel.Invoke(d, new object[] { uiPart });
}
else
{
containerPanel.Controls.Clear();
containerPanel.Controls.Add(uiPart);
}
uiPart.Size = this.containerPanel.Size;
uiPart.Dock = DockStyle.Fill;
}
UIPart
类继承自UserControl
我的UserControls继承自UIPart
。
此方法和调用启动如下:
public class myClass
{
...
private static MainPage _frmMain;
private static myUIPart6 UIP6;
...
public static void aMethod(/* Some arguments */)
{
UIP6 = new myUIPart6 { /* Some settings of properties */ };
_frmMain.IncludeUIPart(UIP6);
_frmMain.Show(); /*Throws an error*/
}
...
}
错误是:
跨线程操作无效:控制' MainPage'从创建它的线程以外的线程访问。
我在这里找到了很多关于这个错误的问题和许多答案,但是我无法弄清楚为什么它会在_frmMain.Show();
投掷?,我应该调用别的吗?还是我错了?它与我的UserControl的Handle的创建有关吗?
答案 0 :(得分:2)
尝试添加以下代码:
class Foo
{
static Form _frmMain;
public static void aMethod()
{
_frmMain.Show();
}
public static void aMethodCaller()
{
if (_frmMain.InvokeRequired)
_frmMain.Invoke(new Action(aMethod));
else
aMethod();
}
}
并将代码中对aMethod()的所有引用替换为aMethodCaller()
以下是示例代码:
string test = "This is test string";
string::size_type position;
position = test.find(ID);
if (position != test.npos){
cout << "Found: " << position << endl;
}
else{
cout << "not found ID << endl;
}
答案 1 :(得分:1)
_frmMain.Show()
没有受到任何调用要求检查的保护。所以你可能在后台线程中调用它。