public void CheckUnusedTabs(string strTabToRemove)
{
TabPage tp = TaskBarRef.tabControl1.TabPages[strTabToRemove];
tp.Controls.Remove(this);
TaskBarRef.tabControl1.TabPages.Remove(tp);
}
我正在尝试使用上面的代码关闭Windows应用程序的tabcontrol中的选项卡,我遇到了错误:
跨线程操作无效。
如何解决这个问题?
答案 0 :(得分:25)
您只能从主线程更改WinForm控件。您需要检查控件上的InvokeRequired是否为true,然后根据需要调用该方法。
你可以做这样的事情让它发挥作用:
public void CheckUnusedTabs(string strTabToRemove)
{
if (TaskBarRef.tabControl1.InvokeRequired)
{
TaskBarRef.tabControl1.Invoke(new Action<string>(CheckUnusedTabs), strTabToRemove);
return;
}
TabPage tp = TaskBarRef.tabControl1.TabPages[strTabToRemove];
tp.Controls.Remove(this);
TaskBarRef.tabControl1.TabPages.Remove(tp);
}
答案 1 :(得分:20)
使用invoke调用,因为您正在使用另一个线程访问GUI线程
this.Invoke((MethodInvoker)delegate() {CheckUnusedTabs(""); });
答案 2 :(得分:5)
使用线程和UI控件时,在winforms中,您需要使用InvokeRequired来更改控件。
EDIT。
添加了一个例子。
表格,带按钮和标签。
试
private void button2_Click(object sender, EventArgs e)
{
Thread thread = new Thread(UpdateProcess);
thread.Start();
}
private void SetLabelText(string val)
{
label1.Text = val;
}
delegate void m_SetLabel(string val);
private void UpdateProcess()
{
int i = 0;
while (true)
{
if (label1.InvokeRequired)
{
m_SetLabel setLabel = SetLabelText;
Invoke(setLabel, i.ToString());
}
else
label1.Text = i.ToString();
i++;
Thread.Sleep(500);
}
}
答案 3 :(得分:1)
交叉线程无效异常是由于从主线程以外的其他线程访问UI控件。请参阅此 http://helpprogramming.blogspot.com/2011/10/invalid-cross-thread-operation.html
答案 4 :(得分:-3)
设置以下变量:
CheckIllegalCrossThreadValidation = false