找出最后一个焦点的控件

Thu*_*der 8 .net c# winforms

我有一个带有几个文本框和一个按钮的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);
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Cod*_*ray 17

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

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

private Control _focusedControl;
Run Code Online (Sandbox Code Playgroud)

然后,GotFocus对于每个文本框控件,您只需_focusedControl使用该文本框更新变量:

private void TextBox_GotFocus(object sender, EventArgs e)
{
    _focusedControl = (Control)sender;
}
Run Code Online (Sandbox Code Playgroud)

现在,只要单击一个按钮(为什么你使用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;
    }
}
Run Code Online (Sandbox Code Playgroud)