我有一个创建新线程的按钮。该线程包含以下内容。
foreach (DataRow r in results.Rows)
{
var item = new ResultItem(this)
{
Image = r[1].ToString(),
Video = r[2].ToString(),
Title = r[3].ToString().Trim(),
Duration = r[4].ToString().Trim()
};
SearchFlow.Controls.Add(item);
}
我收到此错误:在一个线程上创建的控件不能作为另一个线程上的控件的父级。 ResItem是自定义用户控件,它是项目的一部分,而不是第三方控件。有没有解决的办法?如何将此控件添加到新线程中的流程表中?
答案 0 :(得分:6)
您只能触摸创建它们的线程上的UI控件。这也意味着后台线程创建的任何控件都无法添加到您的UI中。
解决方案是仅使用UI(前台)线程创建控件。
执行此操作的一种方法是在窗体上创建一个方法来创建所需的控件,并让它检查它是否是前台线程。如果没有,它可以将自己编组到前台。这可以通过任何实现ISyncronizeInvoke的控件来完成。
private void Foo(object state)
{
if (this.InvokeRequired)
{
this.Invoke(Foo, state);
return;
}
// Do your creation of UI here...
}
请注意,此示例将阻止后台线程,直到UI有一些时间来处理该方法。