Запретить обработку WinForm AcceptButton клавишей возврата

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

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

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

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

Ответы на вопрос(4)

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

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

myTextBox.Leave += (s, e) => { AcceptButton = btnOK; };

используйте 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;
};

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

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

myTextBox.AcceptsReturn = true;

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

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

 fusi10 авг. 2016 г., 17:12
Это решение будет работать только в том случае, если свойство TextBox для Multiline имеет значение true.
 Cyril Gandon19 мар. 2013 г., 12:05
Намного лучшее и элегантное решение, +1!
Решение Вопроса

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

 Dave Downs21 сент. 2010 г., 16:20
Это так очевидно, когда кто-то указывает на это! :)
 Samuel24 окт. 2014 г., 21:05
Это очевидно, но мы всегда находимся в ситуации, когда мы не уверены, что это именно то, что нужно сделать в обход.
 NobodysNightmare02 апр. 2015 г., 14:08
@Samuel: потому что вы разместили свой комментарий после того, как я разместил свойответ ниже: это ИМХО нет что нужно сделать, потому что нет обходного пути не требуется. ИМХО этоa способ сделать это, но не путь ^^

Ваш ответ на вопрос