Узнайте контроль с последним фокусом - PullRequest
8 голосов
/ 13 декабря 2010

У меня есть приложение c # windows 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);
            }
        }
    }
}

Ответы [ 3 ]

17 голосов
/ 13 декабря 2010

Нет встроенного свойства или функциональности для отслеживания ранее сфокусированного элемента управления. Как вы упомянули, всякий раз, когда нажимается кнопка, она получает фокус. Если вы хотите отслеживать текстовое поле, которое было сфокусировано до этого, вам придется сделать это самостоятельно.

Один из способов сделать это - добавить переменную уровня класса в форму, которая содержит ссылку на текущий элемент управления textbox:

private Control _focusedControl;

А затем в событии GotFocus для каждого из ваших элементов управления текстовым полем вы просто обновили бы переменную _focusedControl этим текстовым полем:

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

Теперь, когда нажимается кнопка (почему вы используете событие MouseDown, как показано в вашем вопросе вместо события Click кнопки?), Вы можете использовать ссылку на ранее сфокусированный элемент управления textbox, который сохраняется в переменной уровня класса, как вам нравится:

private void button1_Click(object sender, EventArgs e)
{
    if (_focusedControl != null)
    {
        //Change the color of the previously-focused textbox
        _focusedControl.BackColor = Color.Red;
    }
}
3 голосов
/ 13 декабря 2010

Вы можете подписаться на событие GotFocus ваших текстовых полей, сохранить текстовое поле (вы получите с параметром отправителя) в поле и использовать это поле при нажатии вашей кнопки?

2 голосов
/ 18 января 2012

Я бы использовал событие button1_MouseHover.Когда это событие инициируется, ActiveControl остается указателем на предыдущий элемент управления, который можно сохранить как _focusedControl.

Конечно, это не будет работать, если пользователь перейдет на кнопку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...