2012-03-12 16 views
10

Amici, sto lavorando all'applicazione Windows utilizzando C#. Sto usando un datagridview per visualizzare i record. La funzionalità di cui ho bisogno è quando premo il tasto "Invio" il focus dovrebbe andare alla cella successiva (colonna della stessa riga). Se è l'ultima colonna della griglia, allora lo stato attivo dovrebbe andare alla prima colonna della riga successiva. Ho già provato conCome spostare lo stato attivo sulla cella successiva in una vista datagrid su Invio tasto premere evento

SendKeys.Send("{Tab}") 

in datagridview1_KeyDown e datagridview1_KeyPress evento. Ma l'attenzione si sposta in diagonale verso il basso. Per favore aiutami a risolvere questo.

risposta

12
private void dataGridView1_KeyDown(object sender, KeyEventArgs e) 
{ 
    e.SuppressKeyPress = true; 
    int iColumn = dataGridView1.CurrentCell.ColumnIndex; 
    int iRow = dataGridView1.CurrentCell.RowIndex; 
    if (iColumn == dataGridView1.Columncount-1) 
    { 
     if (dataGridView1.RowCount > (iRow + 1)) 
     { 
      dataGridView1.CurrentCell = dataGridView1[1, iRow + 1]; 
     } 
     else 
     { 
      //focus next control 
     } 
    } 
    else 
     dataGridView1.CurrentCell = dataGridView1[iColumn + 1, iRow]; 
} 
+1

Funziona ma non al 100%. Quando la prima volta viene popolata la griglia, seleziono la prima cella. Dopo di che premo "Invio", ora lo stato attivo passa alla seconda riga (anche se ho 4 colonne). E anche dopo aver raggiunto l'ultima cella (ultima riga, ultima colonna), dà errore come "Indice fuori intervallo" .. – Sukanya

+0

Tranne queste due cose funziona perfettamente. – Sukanya

+1

Ya .. lo so .. ero tranquillo in fretta in quel momento. quindi non l'ho completato .. Puoi anche scrivere il codice quando raggiungi l'ultima riga e poi se hai bisogno di una nuova riga da creare puoi creare quindi –

6

è possibile utilizzare l'evento selectionchanged del datagridview. Nel modulo

 private DataGridViewCell _celWasEndEdit; 

     private void datagridview_SelectionChanged(object sender, EventArgs e) 
    { 

     if (MouseButtons != 0) return; 

     if (_celWasEndEdit != null && datagridview.CurrentCell != null) 
     { 
      // if we are currently in the next line of last edit cell 
      if (datagridview.CurrentCell.RowIndex == _celWasEndEdit.RowIndex + 1 && 
       datagridview.CurrentCell.ColumnIndex == _celWasEndEdit.ColumnIndex) 
      { 
       int iColNew; 
       int iRowNew = 0; 
       if (_celWasEndEdit.ColumnIndex >= datagridview.ColumnCount - 1) 
       { 
        iColNew = 0; 
        iRowNew = dgvItems.CurrentCell.RowIndex;     
       } 
       else 
       { 
         iColNew = _celWasEndEdit.ColumnIndex + 1; 
         iRowNew = _celWasEndEdit.RowIndex; 
       } 
       datagridview.CurrentCell = datagridview[iColNew, iRowNew]; 
      } 
     } 
     _celWasEndEdit = null; 
     } 

    private void datagridview_CellEndEdit(object sender, DataGridViewCellEventArgs e) 
    { 
     _celWasEndEdit = dgvItems[e.ColumnIndex, e.RowIndex]; 
    } 
+0

è solo una variabile che viene utilizzato per monitorare la cella che si sta modificando –

+0

è nullo di default –

+0

privato DataGridViewCell _celWasEndEdit; Ho scritto sopra la soluzione –

2
bool notlastColumn =true; //class level variable--- to check either last column is reached or not 

private void dataGridView1_CellEndEdit(object sender, DataGridViewCellEventArgs e) 
{ 
    if (dataGridView1.ColumnCount - 1 == e.ColumnIndex) //if last column 
    { 
     KeyEventArgs forKeyDown = new KeyEventArgs(Keys.Enter); 
     notlastColumn = false; 
     dataGridView1_KeyDown(dataGridView1, forKeyDown); 
    } 
    else 
    { 
     SendKeys.Send("{up}"); 
     SendKeys.Send("{right}"); 
    } 
} 

private void dataGridView1_KeyDown(object sender, KeyEventArgs e) 
{ 
    if (e.KeyCode == Keys.Enter && notlastColumn) //if not last column move to nex 
    { 
     SendKeys.Send("{up}"); 
     SendKeys.Send("{right}"); 
    } 
    else if (e.KeyCode == Keys.Enter) 
    { 
     SendKeys.Send("{home}");//go to first column 
     notlastColumn = true; 
    } 
} 
7
protected override bool ProcessCmdKey(ref System.Windows.Forms.Message msg, System.Windows.Forms.Keys keyData) 
{ 
    int icolumn = dataGridView1.CurrentCell.ColumnIndex; 
    int irow = dataGridView1.CurrentCell.RowIndex; 

    if (keyData == Keys.Enter) 
    {         
     if (icolumn == dataGridView1.Columns.Count - 1) 
     { 
      dataGridView1.Rows.Add(); 
      dataGridView1.CurrentCell = dataGridView1[0, irow + 1]; 
     } 
     else 
     { 
      dataGridView1.CurrentCell = dataGridView1[icolumn + 1, irow]; 
     } 
     return true; 
    } 
    else 
     return base.ProcessCmdKey(ref msg, keyData); 
    } 
} 
+1

Questo funziona per me, –

+0

Viene eseguito anche quando c'è una casella di testo sull'interfaccia utente, accanto alla vista datagrid, quando si preme Invio nella casella di testo. – qakmak

+0

anche io ... grazie mille !!! –

0

Anche se i codici che ho provato spostato l'attenzione alla cella successiva, essi dove effettuare il clic del mouse quando la cellula è in modalità di modifica. Questo è quello che alla fine mi è venuto in mente.

bool _dgv_list_cellEndEdit = false; // class level variable 

    void dataGridView1_KeyDown(object sender, KeyEventArgs e) 
    { 
     if (e.KeyData == Keys.Enter) 
     { 
      e.SuppressKeyPress=true; 
      SendKeys.Send("{Tab}"); 
     } 
    } 

    void dataGridView1_CellBeginEdit(object sender, DataGridViewCellCancelEventArgs e) 
    { 
     _dgv_list_cellEndEdit=true; 
    } 

    void dataGridView1_MouseDown(object sender, MouseEventArgs e) 
    { 
     _dgv_list_cellEndEdit=false; 
    } 

    void dataGridView1_CellEndEdit(object sender, DataGridViewCellEventArgs e) 
    { 
     if(_dgv_list_cellEndEdit) 
     { 
      _dgv_list_cellEndEdit=false; 
      SendKeys.Send("{Up}"); 
      SendKeys.Send("{Tab}"); 
     } 
    } 
Problemi correlati