找出最后一个焦点的控件

我有一个带有几个文本框和一个按钮的ac #windows窗体应用程序。 我想找出具有焦点并对其做一些事情的文本框。 我写了下面的代码,但当然它不起作用,因为按钮会在按下后立即获得焦点。

private void button1_MouseDown(object sender, MouseEventArgs e) { foreach (Control t in this.Controls) { if (t is TextBox) { if (t.Focused) { MessageBox.Show(t.Name); } } } } 

没有内置属性或function来跟踪以前关注的控件。 正如您所提到的,只要单击按钮,它就会成为焦点。 如果你想跟踪之前关注的文本框,你将不得不自己动手。

解决此问题的一种方法是在表单中添加一个类级变量,该变量包含对当前焦点文本框控件的引用:

 private Control _focusedControl; 

然后在每个文本框控件的GotFocus事件中,您只需使用该文本框更新_focusedControl变量:

 private void TextBox_GotFocus(object sender, EventArgs e) { _focusedControl = (Control)sender; } 

现在,无论何时单击按钮(为什么使用问题中显示的MouseDown事件而不是按钮的Click事件?),您可以使用对类级变量中保存的先前聚焦的文本框控件的引用但是你喜欢:

 private void button1_Click(object sender, EventArgs e) { if (_focusedControl != null) { //Change the color of the previously-focused textbox _focusedControl.BackColor = Color.Red; } } 

您可以订阅文本框的GotFocus事件,在字段中存储文本框(您可以使用sender参数),并在按下按钮时使用此字段?

我会使用button1_MouseHover事件。 触发此事件时, ActiveControl将指向上一个控件,您可以将其存储为_focusedControl

当然,如果用户选中按钮,这将不起作用。