Как «привязать» фокус формы к конкретному элементу управления? - PullRequest
3 голосов
/ 11 ноября 2008

Как можно привязать фокус приложения .net к конкретному элементу управления? Например, если у меня есть форма с 5 текстовыми полями, и я хочу, чтобы они были заполнены в определенном порядке, как я могу помешать кому-то, находящемуся в блоке 1, вкладывать / щелкать блок 2, или нажимать «ОК», «Отмена» или что-то еще ? Есть ли простой способ, или я должен вручную отключить / включить друг друга в соответствующее время?

Проблема с очевидным решением (сбросить фокус, когда фокус потерян) состоит в том, что MSDN говорит, что вы можете заблокировать свою машину таким образом:

(Источник: http://msdn.microsoft.com/en-us/library/system.windows.forms.control.leave.aspx)

Внимание:

Не пытайтесь установить фокус из обработчиков событий Enter, GotFocus, Leave, LostFocus, Validating или Validated. Это может привести к тому, что ваше приложение или операционная система перестанут отвечать на запросы. Дополнительные сведения см. В разделе WM_KILLFOCUS в разделе «Справочник по вводу с клавиатуры» и в разделе «Блокировка сообщений» в разделе «О сообщениях и очередях сообщений» в библиотеке MSDN по адресу http://msdn.microsoft.com/library.

Ответы [ 3 ]

5 голосов
/ 11 ноября 2008

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

private void textBox1_Leave(object sender, EventArgs e)
{
    if string.isNullOrEmpty(textBox1.Text)
    {
        textBox1.focus();
    }
}

Сделайте это для каждого из ваших элементов управления или сделайте его более общим, например:

private void textBox_Leave(object sender, EventArgs e)
{
    TextBox textBox = sender as TextBox;
    if (string.isNullOrEmpty(textBox.Text)
    {
        textBox.focus();
    }
}
3 голосов
/ 11 ноября 2008

В принципе, вы должны быть драконовским в своем дизайне.

  • Проверьте, когда текстовое поле теряет фокус, и если у него нет действительных данных вход, восстановить фокус.
  • захват, когда форма пытается закрыть --Проверьте, есть ли в текстовом поле правильные данные, а если нет отменить закрытие.
  • захватывать события мыши и проверять наличие данные, отправив фокус туда, где вы хочу независимо от того, что пользователь пробовать.

Все это говорит о том, что это ПЛОХАЯ идея, которая приведет к безумным пользователям. Мое предложение состоит в том, чтобы придумать другую парадигму для ввода данных, которая может обрабатывать получение данных в надежной форме, а не быть злой в вашем дизайне и вызывать определенное поведение.

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

Я думаю, что событие TextBox.Validating более уместно, и оно предназначено именно для этого. Также это намного проще, так как вам не нужно устанавливать фокус, все, что вам нужно сделать, это установить e.Cancel = true;, чтобы вернуть фокус на текущий элемент управления

    void textBox1_Validating(object sender, CancelEventArgs e)
    {
        if (true) //Condition not met
        {
            e.Cancel = true;//Return focus to the current control
        }
    }

Убедитесь, что CauseValidation в свойстве текстового поля имеет значение true, для которого по умолчанию установлено значение true.

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