Запретить обработку WinForm AcceptButton клавишей возврата - PullRequest
10 голосов
/ 21 сентября 2010

У меня есть форма с кнопкой, подключенной к свойству AcceptButton, так что возникает логика, и форма закрывается, когда пользователь нажимает клавишу Return.

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

Как запретить обработке формы нажимать клавишу, когда пользователь нажимает клавишу Return, когда TextBox имеет фокус?

Я пытался сказать, что нажатие клавиши было обработано в обработчике события TextBox.KeyDown через KeyEventArgs.Handled, но событие Button.Click моей кнопки подтверждения запускается первым ...

Ответы [ 4 ]

14 голосов
/ 27 февраля 2013

При сбросе форм AcceptButton, когда TextBox имеет фокус, я считаю, что более подходящим решением является использование свойства TextBoxes AcceptsReturn.

Если вы установите

myTextBox.AcceptsReturn = true;

Форма не будет принята при нажатии RETURN, но ваш TextBox может справиться с этим сам.

Это избавит от необходимости сбрасывать AcceptButton в нескольких местах в вашем коде.

11 голосов
/ 21 сентября 2010

Используйте события Enter и Leave TextBox, чтобы установить для свойства AcceptButton значение null (на Enter) и переназначить ему кнопку (на Leave).

4 голосов
/ 21 сентября 2010

Установите свойство AcceptButton в null при создании этого текстового поля и установите его обратно в нормальное значение, когда оно теряет фокус

var myTextBox = new TextBox ... ;
AcceptButton = null;

myTextBox.Leave += (s, e) => { AcceptButton = btnOK; };
1 голос
/ 25 сентября 2014

Чтобы получить полный рабочий пример, используйте AcceptReturn = true для TextBox как NobodysNightmare предложил и установите для SuppressKeyPress значение true, чтобы избежать наложения события на форму.Чтобы использовать AcceptButton, вам нужно установить / сбросить свойство AcceptButton, когда вы вводите / оставляете текстовое поле, как Фредрик Мёрк предложил .

var tb = new TextBox ...;  
IButtonControl _oldAcceptButton = null;  
tb.AcceptReturn=true;
tb.KeyDown += (s,e) => {
  if(e.KeyCode==Keys.Enter) {
    e.Handled=true;
    //will not inform any parent controls about the event.
    e.SuppressKeyPress=true;

    //do your own logic
    ....
  }
};
tb.Enter+=(s,e)=> {
  _oldAcceptButton = AcceptButton;
  AcceptButton = null;
};
tb.Leave+=(s,e)=>{
  AcceptButton = _oldAcceptButton;
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...