Как вернуть фокус на последний использованный элемент управления после нажатия кнопки в приложении winform? - PullRequest
6 голосов
/ 01 сентября 2008

Я работаю над приложением Windows Form (C #), где пользователь вводит данные в форму. В любой момент при редактировании данных в форме пользователь может нажать одну из кнопок в форме, чтобы выполнить определенные действия. По умолчанию фокус переходит к нажатой кнопке, поэтому пользователь должен снова вернуться к элементу управления, который он хочет редактировать, чтобы продолжить изменение данных в форме. Что мне нужно сделать, это вернуть фокус к последнему отредактированному элементу управления после обработки события нажатия кнопки. Вот пример скриншота, который иллюстрирует то, о чем я говорю:

Sample App Screen Shot

Пользователь может вводить данные в textbox1, textbox2, textbox3 и т. Д. И нажимать кнопку. Мне нужна кнопка, чтобы вернуть фокус обратно к элементу управления, на котором фокус был до того, как была нажата кнопка.

Мне интересно, есть ли у кого-нибудь способ реализовать эту функцию лучше, чем я придумал. Вот что я сейчас делаю:

   public partial class Form1 : Form
    {
        Control _lastEnteredControl;

        private void textBox_Enter(object sender, EventArgs e)
        {
            _lastEnteredControl = (Control)sender;
        }

        private void button1_Click(object sender, EventArgs e)
        {
            MessageBox.Show("Do something here");
            _lastEnteredControl.Focus();
        }


    }

Итак, в основном, здесь мы имеем переменную класса, которая указывает на последний введенный элемент управления. Каждое текстовое поле в форме настраивается, поэтому метод textBox_Enter запускается, когда элемент управления получает фокус. Затем при нажатии кнопки фокус возвращается к элементу управления, который имел фокус до нажатия кнопки. У кого-нибудь есть более изящные решения для этого?

Ответы [ 7 ]

16 голосов
/ 01 сентября 2008

Для немного «простоты», возможно, попробуйте.

public Form1()
    {
        InitializeComponent();

        foreach (Control ctrl in Controls)
        {
            if (ctrl is TextBox)
            {
                ctrl.Enter += delegate(object sender, EventArgs e)
                              {
                                  _lastEnteredControl = (Control)sender;
                              };
            }
        }
    }

тогда вам не нужно беспокоиться об украшении каждого текстового поля вручную (или забывать об этом тоже).

2 голосов
/ 06 ноября 2008

Вы можете сделать следующее

Измените кнопку на метку и сделайте ее похожей на кнопку. Ярлык никогда не будет сфокусирован, и вам не придется делать все дополнительное кодирование.

1 голос
/ 01 сентября 2008

Ваш подход выглядит хорошо. Если вы не хотите добавлять обработчик событий к каждому добавляемому элементу управления, вы можете создать рекурсивную подпрограмму для добавления прослушивателя GotFocus к каждому элементу управления в вашей форме. Это будет работать для любого типа контроля в вашей форме, однако вы можете настроить его в соответствии со своими потребностями.

private void Form_OnLoad(object obj, EventArgs e)
{
    AddGotFocusListener(this);
}

private void AddGotFocusListener(Control ctrl)
{
    foreach(Control c in ctrl.Controls)
    {
        c.GotFocus += new EventHandler(Control_GotFocus);
        if(c.Controls.Count > 0)
        {
            AddGotFocusListener(c);
        }
    }
}

private void Control_GotFocus(object obj, EventArgs e)
{
    // Set focused control here
}
1 голос
/ 01 сентября 2008

Я думаю, что вы делаете хорошо. Единственное, что я мог придумать, чтобы улучшить его, - это сохранить каждый элемент управления в стеке по мере их доступа. Это даст вам полную временную шкалу того, к чему был осуществлен доступ.

0 голосов
/ 18 июня 2014

Создайте класс с именем CustomTextBox, который наследуется от TextBox. У этого есть статическая переменная, названная стеком. Когда текстовое поле теряет фокус, нажмите на стек. Если вы хотите найти последний сфокусированный элемент управления, просто извлеките первый элемент из стека. Обязательно очистите статическую переменную Stack.

0 голосов
/ 01 сентября 2008

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

0 голосов
/ 01 сентября 2008

Ваша реализация выглядит достаточно хорошо - я хочу знать, почему вы хотите сделать это в первую очередь? Не будет ли предпочтительным, чтобы фокус вернулся к первой записи? Являются ли данные в последнем текстовом поле настолько податливыми, что после нажатия кнопки они «запоминаются»? Или у вас есть какая-то операция, которую кнопка выполняет с этими специфическими данными текстового поля - в этом случае фокус не должен перейти к следующему элементу управления вместо этого?

Мне интересно узнать, почему вы хотите сделать это в первую очередь.

...