2009-04-13 4 views
1

Используя winforms, я установил для свойства KeyPreview значение true и обработчики событий для соответствующих ключевых событий в базовой форме.Кнопка предварительного просмотра и принятия ключей

В пределах форм, которые наследуются от него, я устанавливаю свойство AcceptButton на основе требований приложения.

Есть определенные случаи, когда я хочу, чтобы клавиша ввода имела функциональность, отличную от функциональности AcceptButton.

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

Похоже, что щелчок AcceptButton запускается перед любым ключевым событием в моей форме basef. Я мог бы написать функциональность в событиях щелчка возможных кнопок принятия, но, на мой взгляд, это будет взлом.

Любые предложения?

Спасибо.

+0

А вопрос прослеживания, что может помочь решить мою проблему выше будет «Есть ли способ подавить AcceptButton кликать? – user90279

ответ

2

Другой способ справиться с этим - переопределить метод ProcessDialogKey() формы, где вы можете подавить кнопки accept и/или cancel. Например, у меня есть приложение с фильтром, который фильтрует сетку на основе пользовательского ввода. Я хочу, чтобы пользователь мог нажать клавишу возврата, когда элемент управления фильтром имеет фокус, чтобы применить фильтр. Проблема заключается в том, что код кнопки принятия принимается и закрывает форму. В приведенном ниже кодере проблема устранена.

protected override bool ProcessDialogKey(Keys keyData) 
    { 
     // Suppress the accept button when the filter editor has the focus. 
     // This doesn't work in the KeyDown or KeyPress events. 
     if (((keyData & Keys.Return) == Keys.Return) && (filterEditor.ContainsFocus)) 
      return false; 

     return base.ProcessDialogKey(keyData); 
    } 

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

private readonly List<Control> _disableAcceptButtonList = new List<Control>(); 

    protected override bool ProcessDialogKey(Keys keyData) 
    { 
     if (((keyData & Keys.Return) == Keys.Return) && (_disableAcceptButtonList.Count > 0)) 
     { 
      foreach (Control control in _disableAcceptButtonList) 
       if (control.ContainsFocus) 
        return false; 
     } 

     return base.ProcessDialogKey(keyData); 
    } 

    protected virtual void DisableAcceptButtonForControl(Control control) 
    { 
     if (!_disableAcceptButtonList.Contains(control)) 
      _disableAcceptButtonList.Add(control); 
    } 
+0

Твердая идея. Мне нравится, как он может быть применен на глобальном уровне, в случае необходимости, тогда как мой - только для конкретного контроля. – user90279

0

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

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

Спасибо.

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

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