Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- public class RequestNewRowEventArgs : EventArgs
- {
- #region Properties
- public bool RowAdded { get; set; }
- public bool Handled { get; set; }
- #endregion
- }
- public delegate void RequestNewRowEventHandler(object sender, RequestNewRowEventArgs e);
- public class MiDataGridView : DataGridViewX
- {
- public event RequestNewRowEventHandler RequestNewRow;
- protected void RaiseRequestNewRow(RequestNewRowEventArgs e)
- {
- RequestNewRow?.Invoke(this, e);
- }
- protected override void OnKeyDown(KeyEventArgs e)
- {
- if (e.KeyCode == Keys.Enter)
- {
- SendKeys.Send("{TAB}");
- e.Handled = true;
- return;
- }
- base.OnKeyDown(e);
- }
- protected override bool ProcessDialogKey(Keys keyData)
- {
- Keys k = keyData & Keys.KeyCode;
- if (k == Keys.Tab)
- {
- Debug.Print("Se ha presionado la tecla TAB.");
- //Obtener la posición actual.
- int r = CurrentCell.RowIndex;
- int c = CurrentCell.ColumnIndex;
- bool isNewRow = CurrentRow.IsNewRow;
- Debug.Print("Fila: {0}, columna: {1}, es nueva: {2}", r, c, isNewRow);
- /*
- * Las reglas:
- * 1. Si todas las columnas son de lectura, no implementar esta lógica.
- * 2. Si hay columnas de escritura en la fila actual a la derecha de la celda
- * actual, moverse a la siguiente columna de escritura de esta fila.
- * 3. Si no hay columnas de escritura en la fila actual a la derecha de la celda
- * actual, moverse a la fila siguiente, primera columna de escritura.
- */
- bool allReadOnly = true;
- foreach (DataGridViewColumn col in Columns)
- {
- if (!col.ReadOnly)
- {
- allReadOnly = false;
- break;
- }
- }
- if (allReadOnly)
- {
- //Regla 1.
- return base.ProcessDialogKey(keyData);
- }
- //Buscar la siguiente columna que no sea de sólo lectura.
- while (c < Columns.Count - 1 && Columns[c + 1].ReadOnly)
- {
- ++c;
- }
- if (c >= Columns.Count - 1)
- {
- //Regla 2.
- if (++r == Rows.Count)
- {
- RequestNewRowEventArgs e = new RequestNewRowEventArgs()
- {
- Handled = false,
- RowAdded = false
- };
- RaiseRequestNewRow(e);
- if ((e.Handled && !e.RowAdded) || (!e.Handled && !AllowUserToAddRows))
- {
- return base.ProcessDialogKey(keyData);
- }
- else if (!e.Handled && AllowUserToAddRows)
- {
- Rows.Add();
- }
- }
- c = 0;
- while (Columns[c + 1].ReadOnly)
- {
- ++c;
- }
- }
- else
- {
- //Regla 3. Nada más que hacer.
- }
- CurrentCell = Rows[r].Cells[c];
- return true;
- }
- else
- {
- return base.ProcessDialogKey(keyData);
- }
- }
- }
Add Comment
Please, Sign In to add comment