2008-11-11 3 views
2

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

Проблема с очевидным решением (сброс фокуса при потере фокусировки) является то, что 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.

ответ

5

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

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

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

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

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

1

Я думаю, что событие 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.

Смежные вопросы