Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在IF语句中调用控件_C#_Delegates_Controls_Invoke - Fatal编程技术网

C# 如何在IF语句中调用控件

C# 如何在IF语句中调用控件,c#,delegates,controls,invoke,C#,Delegates,Controls,Invoke,我已经搜索了很长一段时间,寻找如何在if语句中调用控件,但没有找到任何相关信息。我肯定我错过了一些东西,但如果有人能告诉我如何做到这一点,那就太好了。下面是我的一小段代码,让您了解我的问题所在 if(cardPanelOpponent.GetChildAtPoint(new Point(i, x)) == null) { OpponentCard.Location = new Point(i, x); cardPanelOpponent.Invoke(new Action

我已经搜索了很长一段时间,寻找如何在if语句中调用控件,但没有找到任何相关信息。我肯定我错过了一些东西,但如果有人能告诉我如何做到这一点,那就太好了。下面是我的一小段代码,让您了解我的问题所在

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

这一行发生在异步环境中,因此我得到了一个跨线程异常。如何在与UI不同的线程上运行此if语句。

如果您的代码在工作线程中运行,则不允许调用
GetChildAtPoint
或在其中设置
位置。您需要将控件传递给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语句。因此,您可能需要根据需要对其进行更正。

好的,if语句可以正常工作,但由于无法中断,它基本上陷入了无限循环中。我不确定我是否理解如何回到UI线程上,以便在它添加控件后能够跳出循环,而不是继续。有什么建议吗?发布完整的循环代码,可能是整个方法。我将尝试根据Lyokay更新我的答案,我所做的是创建一个bool变量,如果它添加了控件,则将其设置为true。在匿名方法之后,我检查它并从那里中断。谢谢你的帮助。