2016-11-24 12 views
-1

У меня есть поблем. После нажатия Enter I открывается новая форма (form2), где я могу добавить что-то к db. On Form2 - кнопка Ok. Если я активирую эту кнопку нажатием Enter, я закрываю форму2.C# - KeyUp только на одной форме

Проблема заключается в том, что этим действием я другое время вызова KeyUp на Form1, и Im в петлю ..

вот пример:

private void Form1_Load(object sender, EventArgs e) 
     { 
      this.KeyPreview = true; 
      this.KeyUp += new System.Windows.Forms.KeyEventHandler(KeyEvent); 
     }   
private void KeyEvent(object sender, KeyEventArgs e) 
     { 
      if (e.KeyCode == Keys.Enter) 
      { 
       dataGridViewSkladovePolozky.Focus(); 
       pridatDoKosiku(); 
      } 
     } 
private void buttonPridatDoKosiku_Click(object sender, EventArgs e) 
     { 
      pridatDoKosiku(); 
     } 
private void pridatDoKosiku() 
     { 
      PridatDoKosiku pridatDoKosiku = new PridatDoKosiku(); 
      pridatDoKosiku.ShowDialog(); 
      refreshNakupniKosik(true); 
      pridatDoKosiku.Dispose(); 
     } 
+0

Это вызвано 'this.KeyPreview = true;'. Если вы хотите сохранить это поведение, когда form2 открыт, то в свой 'KeyEvent' просто добавьте' if (form2.Visible) return; ' –

+0

Нет никакой особой причины, чтобы поддержать KeyUp. Вероятно, вы сделали это, чтобы попытаться обойти неудобное поведение KeyPreview. Что является устаревшим свойством VB6 и имеет семантику VB6, вы не получите событие KeyDown для клавиш навигации. Как и Enter. Вместо этого переопределите ProcessCmdKey(). –

ответ

0

Так как вы уже отмечали KeyPreview в вашей форме, он будет захватывать все ключевые события. Вы можете установить флаг & управлять таким образом.

bool InFocus = false; 
    private void Form1_Load(object sender, EventArgs e) 
      { 
       this.KeyPreview = true; 
       this.KeyUp += new System.Windows.Forms.KeyEventHandler(KeyEvent); 
      }   
    private void KeyEvent(object sender, KeyEventArgs e) 
      { 
      if(InFocus) return; 
       if (e.KeyCode == Keys.Enter) 
       { 
        dataGridViewSkladovePolozky.Focus(); 
        pridatDoKosiku(); 
       } 
      } 
    private void buttonPridatDoKosiku_Click(object sender, EventArgs e) 
      { 
       pridatDoKosiku(); 
      } 
    private void pridatDoKosiku() 
      { 
       PridatDoKosiku pridatDoKosiku = new PridatDoKosiku(); 
InFocus = true; 
       pridatDoKosiku.ShowDialog(); 
       refreshNakupniKosik(true); 
       pridatDoKosiku.Dispose(); 
InFocus = false; 
      }