2016-11-24 49 views
-1

我有一個問題。 按Enter後,我打開新窗體(窗體2),在那裏我可以添加一些數據庫。 在Form2上按鈕確定。如果我按下回車鍵激活此按鈕,我將關閉form2。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; 
      }