2012-06-04 32 views
0

請,什麼是錯,此代碼:的DataGridView的KeyDown出現兩次

InitializeComponent(); 
this.KeyDown += new KeyEventHandler(dgvC_KeyDown); 

private void dgvC_KeyDown(object sender, KeyEventArgs e) 
{ 
    if (e.KeyValue == 188) 
    { 
     System.Media.SystemSounds.Beep.Play(); 
     e.SuppressKeyPress = true; 
    } 
    if (e.KeyValue == (int)Keys.Delete) 
    { 
     MessageBox.Show("323"); 
    } 
} 

消息框出現了兩次!

如果按下逗號,我想執行一些代碼,如果在DataGridView(dgvC)上按DelKey,則要執行另一個代碼。

MessageBox僅供測試。

+0

看起來你需要顯示更多的代碼。也許你會將'dgvC_KeyDown'綁定到多個事件,例如KeyDown和KeyUp/KeyPress? –

+0

馬里奧,你說得對。我發佈了更多代碼。你能檢查一下嗎? – Bonaca

+0

嘗試在'dgvC_KeyDown'後面搜索* form * .cs和* form * .Designer.cs,並查看該事件是否訂閱了多次。 –

回答

1

看起來您已經訂閱了兩次KeyDown事件。

刪除.Designer.cs文件中的一行,e.SuppressKeyPress仍然可以工作。

+0

Yess!如果我在表單中刪除該行.cs - suppress不起作用,但是如果我在Designer中移除那條線,一切正常。儘管我不明白最好的 - ThankYou! – Bonaca

1

嘗試在ifs內部插入。

e.Handler = true; 

這樣事件將不會重複。

+0

儘管這可以起作用,但它是一個*更好的設計,不需要訂閱一個事件 –

2

您誤解了e.SupporessKeyPress的用途。在你的dataGridView_KeyDown事件中,你使用;

e.SuppressKeyPress = true; 

只阻止事件傳遞給的DataGridView你的方法退出後。

在你的代碼,你也該事件處理程序分配給Form_KeyDown事件,因此事件被捕獲2個不同的控制和SuppressKeyPress並不來自阻止他們接收此事件。

您需要從您的代碼中刪除此行,該代碼將處理程序(我相信erronesouly)分配給Form_KeyDown事件;

this.KeyDown += new KeyEventHandler(dgvC_KeyDown); 
+0

現在已經很清楚了,謝謝你,羅漢! – Bonaca