C# WinForms两次触发Enter事件

C# WinForms两次触发Enter事件,c#,winforms,C#,Winforms,我有以下几点: private void fooForm_Enter( object sender, EventArgs e ) { FooBar() } private void FooBar() { Console.Out.WriteLine( "Foo" ); /* do stuff */ OtherControl.Focus(); } 我在这里遇到的问题是,我可以在控制台中看到两次文本,即使我只关注一次fooForm。但是,

我有以下几点:

private void fooForm_Enter( object sender, EventArgs e )
{
     FooBar()
}

private void FooBar()
{
     Console.Out.WriteLine( "Foo" );
     /*
     do stuff
     */
     OtherControl.Focus();
}
我在这里遇到的问题是,我可以在控制台中看到两次文本,即使我只关注一次fooForm。但是,如果我注释掉OtherControl.focus()行,FooBar将只被调用一次。(否,OtherControl与fooForm不是同一对象。)

是什么导致了这种情况?我可以做些什么来确保FooBar只被调用一次?

根据:

请勿尝试在Enter、GOTCHOCUS、LEVE、LostFocus、Validating或Validated事件处理程序中设置焦点。这样做可能会导致应用程序或操作系统停止响应

您似乎正在这样做。

从以下位置开始:

进入和离开事件是分层的,将在父链上下层叠,直到达到适当的控制

因此,您的
fooForm
也会为其子项接收
Enter
事件

另请注意,来自同一MSDN文章:

请勿尝试在Enter、GOTCHOCUS、LEVE、LostFocus、Validating或Validated事件处理程序中设置焦点。这样做可能会导致应用程序或操作系统停止响应


我在谷歌上做了更多的搜索,找到了一个很好的解决方案来实现我想要的功能,而无需按照此处的解决方案设置这些事件的焦点:

在聚焦事件中更改焦点从来都不是一个好主意。同样重要的是,当表单拥有其他控件时,关注表单如何获得焦点。你需要发布真实的代码来重新处理这个问题以获得帮助,不是这样的。我明白了,我没看到。那么,我可以做些什么来实现此功能?因为我想在一个窗体获得焦点,然后将焦点设置到另一个控件时执行一些操作。实现这一目标的好方法是什么?