2016-11-24 8 views
-1

私はポプレンを持っています。 Enterを押すと新しいフォーム(form2)が開きます。ここでdbに何かを追加できます。 Form2はボタンでOKです。 Enterを押してこのボタンをアクティブにすると、私はform2を閉じます。c# - KeyUpは1つのフォームでのみ

問題は、このアクションによって、私は別の時間がForm1のkeyUpイベントを呼び出すことで、ループ内イム..ここ

は一例です:あなたはそれは、あなたのフォームでKeyPreviewをすでにマークされているので

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

すべての重要なイベントをキャプチャします。 このようにフラグ&を設定することができます。

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; 
      } 
関連する問題