2013-11-18 1 views
1

Так что у меня проблема с ситуацией. У меня есть приложение, которое является MDI-приложением, которое открывает пользовательские документы. У моего родителя MDI есть ToolStrip, с несколькими элементами управления, текстовое поле и кнопка. Текстовое поле содержит значение qty для элемента, затем есть кнопка для добавления элемента в документ. модель для самой быстрой работы, начиная с текстового поля qty, введите qty, tab в текстовое поле номера детали и введите номер #, затем нажмите кнопку добавления и нажмите либо клавишу ввода, либо клавишу пробела. Это происходит быстрее, чем с помощью мыши, чтобы щелкнуть по кнопке, или нажмите, чтобы ввести текстовое поле. Поэтому я хочу, чтобы мое приложение автоматически фокусировало текстовое поле qty после запуска кнопки.Разница между событиями мыши и ключа ToolStripMenuItem

Я обработал событие ToolStripMenuItem.Click, которое добавляет элемент, а затем переориентирует поле qty и отлично работает, когда мышь используется для нажатия кнопки. Но по какой-то причине я еще не обнаружил, что это НЕ работает, когда клавиатура вызывает кнопку. Я знаю, что событие щелчка запускается, потому что элемент добавляется правильно, но фокус не обрабатывается правильно. Фактически, в этом случае кажется, что фокус просто полностью потерян, вкладка перестает функционировать, фокус не может быть восстановлен, за исключением мыши. Я попытался следующие:

  1. вызовов Form.Activate() я родительская форма и обрабатывать Активированный событие, чтобы сосредоточиться текстовое поле.

  2. Вызовите Focus() в родительской форме и обработайте событие GotFocus, чтобы сфокусировать текстовое поле.

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

+0

Не должно быть никакой разницы между обеими ситуациями в том, что касается данного события. Здесь я вижу две возможные проблемы: либо вы делаете что-то в другом событии, которое не запускается в обоих случаях (например: KeyUp не запускается мышью); или событие клика не достигается в обоих случаях (и вы говорите, что этого не происходит ...). В любом случае, лучше всего взглянуть на код, пожалуйста, разместите соответствующие части. – varocarbas

+0

@varocarbas - Я подтвердил его проблему, создав простой пример тестирования. По какой-то причине класс ToolStripButton не имеет никаких событий, связанных с клавиатурой. –

+0

Я смог воспроизвести вашу ситуацию (конечно, странно, без сомнения); хотя ответ, который вы получили, кажется, не дает всегда работающего решения (иногда работает, иногда нет), но, возможно, это самое лучшее, что у вас есть ... – varocarbas

ответ

3

Вы правы, это странное поведение. Я был в состоянии преодолеть это так:

public partial class Form1 : Form 
{ 
    bool myButtonJustClicked = false; 

    public Form1() 
    { 
     InitializeComponent(); 
    } 

    private void toolStripButton1_Click(object sender, EventArgs e) 
    { 
     myButtonJustClicked = true; 
     toolStripTextBox1.Focus(); 
    } 

    private void Form1_KeyUp(object sender, KeyEventArgs e) 
    { 
     if(myButtonJustClicked) 
     { 
      toolStripTextBox1.Focus(); 
      myButtonJustClicked = false; 
     } 
    } 
} 

В основном, я использую «KeyUp» событий формы для обработки события KeyUp, что должен уволят на кнопку, но не событие «KeyUp» , или любые события, связанные с клавиатурой, по какой-либо причине в ToolStripButtons.

Чтобы убедиться, что текстовое поле не получает фокус, когда другие события KeyUp запускаются в другом месте в форме, я использую логику myButtonJustClicked, как показано.

Кроме того, я оставил toolStripTextBox1.Focus(); в методе toolStripButton1_Click для обработки щелчка мыши, конечно.

+0

Perfecto! Благодаря! Это просто трюк! – Wanabrutbeer

+0

Рад помочь. Кстати, вы должны проверить EventSpy Мартина Каролана: http://www.codeproject.com/Articles/11918/EventSpy. Это помогает вам понять, какие события стреляют в таких ситуациях. Я зарегистрировал его в форме, ToolStrip и кнопке, и именно так я понял, что событие «KeyUp» формы запускалось после всего остального. –

+0

Что еще страннее, так это то, что исходный процесс работает по назначению при отладке. Я думаю, что, возможно, это связано с процессом отладки, в результате чего потоки занимают больше времени, чтобы определенные события за пределами точек останова могли сработать, прежде чем фокус() будет выполнен. – Wanabrutbeer

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

  • Нет связанных вопросов^_^