Guest User

Untitled

a guest
Jul 20th, 2018
76
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.74 KB | None | 0 0
  1. public class RequestNewRowEventArgs : EventArgs
  2. {
  3. #region Properties
  4. public bool RowAdded { get; set; }
  5. public bool Handled { get; set; }
  6. #endregion
  7. }
  8.  
  9. public delegate void RequestNewRowEventHandler(object sender, RequestNewRowEventArgs e);
  10.  
  11. public class MiDataGridView : DataGridViewX
  12. {
  13. public event RequestNewRowEventHandler RequestNewRow;
  14.  
  15. protected void RaiseRequestNewRow(RequestNewRowEventArgs e)
  16. {
  17. RequestNewRow?.Invoke(this, e);
  18. }
  19.  
  20. protected override void OnKeyDown(KeyEventArgs e)
  21. {
  22. if (e.KeyCode == Keys.Enter)
  23. {
  24. SendKeys.Send("{TAB}");
  25. e.Handled = true;
  26. return;
  27. }
  28. base.OnKeyDown(e);
  29. }
  30.  
  31. protected override bool ProcessDialogKey(Keys keyData)
  32. {
  33. Keys k = keyData & Keys.KeyCode;
  34. if (k == Keys.Tab)
  35. {
  36. Debug.Print("Se ha presionado la tecla TAB.");
  37. //Obtener la posición actual.
  38. int r = CurrentCell.RowIndex;
  39. int c = CurrentCell.ColumnIndex;
  40. bool isNewRow = CurrentRow.IsNewRow;
  41. Debug.Print("Fila: {0}, columna: {1}, es nueva: {2}", r, c, isNewRow);
  42. /*
  43. * Las reglas:
  44. * 1. Si todas las columnas son de lectura, no implementar esta lógica.
  45. * 2. Si hay columnas de escritura en la fila actual a la derecha de la celda
  46. * actual, moverse a la siguiente columna de escritura de esta fila.
  47. * 3. Si no hay columnas de escritura en la fila actual a la derecha de la celda
  48. * actual, moverse a la fila siguiente, primera columna de escritura.
  49. */
  50. bool allReadOnly = true;
  51. foreach (DataGridViewColumn col in Columns)
  52. {
  53. if (!col.ReadOnly)
  54. {
  55. allReadOnly = false;
  56. break;
  57. }
  58. }
  59. if (allReadOnly)
  60. {
  61. //Regla 1.
  62. return base.ProcessDialogKey(keyData);
  63. }
  64. //Buscar la siguiente columna que no sea de sólo lectura.
  65. while (c < Columns.Count - 1 && Columns[c + 1].ReadOnly)
  66. {
  67. ++c;
  68. }
  69. if (c >= Columns.Count - 1)
  70. {
  71. //Regla 2.
  72. if (++r == Rows.Count)
  73. {
  74. RequestNewRowEventArgs e = new RequestNewRowEventArgs()
  75. {
  76. Handled = false,
  77. RowAdded = false
  78. };
  79. RaiseRequestNewRow(e);
  80. if ((e.Handled && !e.RowAdded) || (!e.Handled && !AllowUserToAddRows))
  81. {
  82. return base.ProcessDialogKey(keyData);
  83. }
  84. else if (!e.Handled && AllowUserToAddRows)
  85. {
  86. Rows.Add();
  87. }
  88. }
  89. c = 0;
  90. while (Columns[c + 1].ReadOnly)
  91. {
  92. ++c;
  93. }
  94. }
  95. else
  96. {
  97. //Regla 3. Nada más que hacer.
  98. }
  99. CurrentCell = Rows[r].Cells[c];
  100. return true;
  101. }
  102. else
  103. {
  104. return base.ProcessDialogKey(keyData);
  105. }
  106.  
  107. }
  108. }
Add Comment
Please, Sign In to add comment