2010-09-13 78 views

回答

15

我在論壇發現了this的代碼,它的工作原理。

private void dataGridView1_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e) 
{ 
    DataGridViewTextBoxEditingControl tb =(DataGridViewTextBoxEditingControl)e.Control; 
    tb.KeyPress += new KeyPressEventHandler(dataGridViewTextBox_KeyPress); 

    e.Control.KeyPress += new KeyPressEventHandler(dataGridViewTextBox_KeyPress); 
} 


private void dataGridViewTextBox_KeyPress(object sender, KeyPressEventArgs e) 
{ 
    //when i press enter,bellow code never run? 
    if (e.KeyChar==(char)Keys.Enter) 
    { 
    MessageBox.Show("You press Enter"); 
    } 
} 
+4

爲什麼添加兩次? – 2013-05-31 13:59:20

4

DataGridViewCell沒有任何事件,但你可以聽上DataGridView本身KeyDown事件,然後看看哪個小區選擇:

public void dataGridView_KeyDown(object sender, KeyEventArgs e) 
{ 
    if (e.KeyCode == Keys.F1) 
    { 
     var selectedCell = dataGridView.SelectedCells[0]; 
     // do something with selectedCell... 
    } 
} 
+0

ok先生...我會嘗試。謝謝 – yonan2236 2010-09-13 02:22:18

+2

來自編輯控件的鍵盤事件不會針對DGV觸發,上述代碼無法在編輯模式下處理關鍵事件。 – 2017-03-12 18:52:29

3

當用戶鍵入到單元格,它實際上是輸入放置在單元格內的控件以進行編輯。例如,一個字符串列類型實際上會創建一個文本框供用戶輸入。所以,當編輯發生時,您需要實際掛鉤放置在單元格內的TextBox的KeyDown事件。

0

另一種解決方案是

private void grdDetalle_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e) 
    { 
     // Sólo queremos esta funcionalidad para determinadas columnas Clave y Nombre 
     if ((grdDetalle.Columns[grdDetalle.CurrentCell.ColumnIndex].Name == "colClaveArticulo") || 
      (grdDetalle.Columns[grdDetalle.CurrentCell.ColumnIndex].Name == "colNombre")) 
     { 
      /// Workarround para que estando editando en las columnas del grid Clave y Nombre 
      /// podamos detectar cuando se dio F4 para lanzar el dialogo de busqueda del 
      /// articulo. 
      e.Control.KeyDown += new KeyEventHandler(dataGridViewTextBox_KeyDown); 
      e.Control.Leave += new EventHandler(dataGridViewTextBox_Leave); 
     } 
    } 

    private void dataGridViewTextBox_Leave(object sender, EventArgs e) 
    { 

     if ((grdDetalle.Columns[grdDetalle.CurrentCell.ColumnIndex].Name == "colClaveArticulo") || 
      (grdDetalle.Columns[grdDetalle.CurrentCell.ColumnIndex].Name == "colNombre")) 
     { 
      try 
      { 
       (sender as DataGridViewTextBoxEditingControl).KeyDown -= 
        new KeyEventHandler(dataGridViewTextBox_KeyDown); 
      } 
      catch (Exception ex) 
      { } 
     } 
    } 

    private void dataGridViewTextBox_KeyDown(object sender, KeyEventArgs e) 
    { 
     // F4 Pressed 
     if ((grdDetalle.Columns[grdDetalle.CurrentCell.ColumnIndex].Name == "colClaveArticulo") || 
      (grdDetalle.Columns[grdDetalle.CurrentCell.ColumnIndex].Name == "colNombre")) 
     { 
      if (e.KeyCode == Keys.F4) // 115 
      { 
       MessageBox.Show("Oprimieron F4"); 
       e.Handled = true; 
       e.SuppressKeyPress = true; 
      } 
     } 
    } 
+1

我建議使用英文變量名稱和註釋修改代碼,這樣人們可以更容易地理解你在做什麼。 – user1071777 2014-12-12 20:12:40

0

我知道這是一個老問題,但我相信我已經在好轉前投答案。

IDataGridViewEditingControl _iDataGridViewEditingControl; 
    private void SlotTimesDGV_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e) 
    { 
     if (_iDataGridViewEditingControl is DataGridViewComboBoxEditingControl) 
     { 
      DataGridViewComboBoxEditingControl iDataGridViewEditingControl = _iDataGridViewEditingControl as DataGridViewComboBoxEditingControl; 
      iDataGridViewEditingControl.KeyPress -= SlotTimesDGV_EditingControlShowing_KeyPress; 
     } 
     if (e.Control is DataGridViewComboBoxEditingControl) 
     { 
      DataGridViewComboBoxEditingControl iDataGridViewEditingControl = e.Control as DataGridViewComboBoxEditingControl; 
      iDataGridViewEditingControl.KeyPress += SlotTimesDGV_EditingControlShowing_KeyPress; 
      _iDataGridViewEditingControl = iDataGridViewEditingControl; 
     } 
    } 

    private void SlotTimesDGV_EditingControlShowing_KeyPress(object sender, KeyPressEventArgs e) 
    { 
     MessageBox.Show(""); 
    } 

通過具有IDataGridViewEditingControl的實例變量,你可以刪除KeyPress事件細胞周圍移動,你的事件不僅限於一種類型的細胞時,將導致重複呼叫。