如何在IF语句中调用控件

时间:2014-03-10 06:44:32

标签: c# delegates controls invoke

我已经搜索了很多关于如何在if语句中调用控件一段时间并且无法在此找到任何内容的搜索。我确定我错过了一些东西,但是如果有人能告诉我如何做到这一点会很棒。这是我的一小段代码,可以让您了解我的问题所在。

if(cardPanelOpponent.GetChildAtPoint(new Point(i, x)) == null)
{
      OpponentCard.Location = new Point(i, x);
      cardPanelOpponent.Invoke(new Action(() => cardPanelOpponent.Controls.Add(OpponentCard))
      break;  }

这一行是在异步环境中进行的,所以我得到一个跨线程异常。如何在不同的线程上运行此if语句,然后是UI。

1 个答案:

答案 0 :(得分:1)

如果您的代码在工作线程中运行,则不允许您拨打GetChildAtPoint或在其中设置Location。您需要将控件传递给UI线程。

if(cardPanelOpponent.InvokeRequired)
{
    cardPanelOpponent.Invoke(new Action(() =>
    {        
        if(cardPanelOpponent.GetChildAtPoint(new Point(i, x)) == null)
        {
              OpponentCard.Location = new Point(i, x);
              cardPanelOpponent.Controls.Add(OpponentCard);
        }        
    });
}

注意:上述代码中的语义已发生变化。我们不能在这里添加break语句。因此,您可能需要根据需要进行更正。