una tecla seleccionar poner net leer foco fila desde currentcell codigo celda capturar cambiar c# datagridview focus keypress datagridviewtextboxcell

tecla - seleccionar una celda de un datagridview c#



¿Cómo evitar ir a la siguiente fila después de editar un DataGridViewTextBoxColumn y presionar EnterKey? (8)

Bueno, me las arreglé para hacer que funcione algo que hace lo que quieres (o al menos hace la parte difícil, creo que ya has hecho la mayoría de las otras cosas) pero la solución hace que mi piel se arrastre.

Con qué terminé para "cancelar" el evento de la tecla Intro al editar una celda para usar una mezcla del evento CellEndEdit y el evento SelectionChanged .

Introduje un par de campos de nivel de clase que almacenan algún estado, en particular en qué fila estamos al final de la edición de una celda y si estamos deteniendo el cambio de una selección.

El código se ve así:

public partial class Form1 : Form { private int currentRow; private bool resetRow = false; public Form1() { InitializeComponent(); // deleted out all the binding code of the grid to focus on the interesting stuff dataGridView1.CellEndEdit += new DataGridViewCellEventHandler(dataGridView1_CellEndEdit); // Use the DataBindingComplete event to attack the SelectionChanged, // avoiding infinite loops and other nastiness. dataGridView1.DataBindingComplete += new DataGridViewBindingCompleteEventHandler(dataGridView1_DataBindingComplete); } void dataGridView1_SelectionChanged(object sender, EventArgs e) { if (resetRow) { resetRow = false; dataGridView1.CurrentCell = dataGridView1.Rows[currentRow].Cells[0]; } } void dataGridView1_CellEndEdit(object sender, DataGridViewCellEventArgs e) { resetRow = true; currentRow = e.RowIndex; } void dataGridView1_DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e) { dataGridView1.SelectionChanged += new EventHandler(dataGridView1_SelectionChanged); } }

Deberá probar esto a fondo para asegurarse de que hace exactamente lo que necesita. Solo verifiqué que no detiene un cambio de fila al presionar enter de un control de edición.

Como dije, no estoy muy feliz con la necesidad de hacer algo como esto, se siente bastante frágil y también podría tener efectos secundarios extraños. Pero si debe tener este comportamiento, y lo prueba bien, creo que esta es la única forma de hacer lo que quiera.

Estoy trabajando en un programa con DataGridViews . En un DatagridView hay un DataGridViewTextBoxColumn , que está habilitado para ser editado por el usuario. Cuando el usuario haya terminado de escribir los números, presiona ENTER en el teclado. Ahora DataGridView hace todos sus Events , y después de todos los Events , lo último es el problema.

Todo está hecho y Windows seleccionará el siguiente DataGridViewRow , y no puedo evitarlo.

Lo intenté

if (e.KeyData == Keys.Enter) e.SuppressKeyPress = true; // or e.Handled

en casi todos los eventos que encontré. Lamentablemente, solo pude evitar la tecla ENTRAR cuando DataGridViewTextBoxColumn no está en modo de edición.

Aquí está mi método para encontrar el ENTER en Edición

Agregar el evento

private void dgr_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e) { e.Control.KeyPress += new KeyPressEventHandler(dgr_KeyPress_NumericTester); }

Y este es el evento para aceptar solo entradas numéricas.

private void dgr_KeyPress_NumericTester(object sender, KeyPressEventArgs e) { if (!Char.IsDigit(e.KeyChar) && e.KeyChar != 8) e.Handled = true; }

Para explicar en detalle:

Cuando el usuario introduce un valor, que tiene algunas dependencias, me gustaría darle otro control al foco, por lo que se usa para corregir las dependencias.

También lo intenté con el DependingControl.Focus() pero la última "entrada" será la última cosa en la vista.

¿Alguien sabe cómo prevenir esto?


Esta respuesta realmente llega tarde ...

Pero tenía exactamente el mismo problema y no quería guardar en caché las filas, etc. Así que busqué en Google y esta es mi solución a la pregunta. Créditos a ¿Cómo prevenir una tecla Enter presionar para finalizar EditMode en un DataGridView?

Heredar de DataGridView y agregar este código (vb.net):

Protected Overrides Function ProcessCmdKey(ByRef msg As Message, keyData As Keys) As Boolean If Commons.Options.RowWiseNavigation AndAlso Me.IsCurrentCellInEditMode AndAlso (keyData = Keys.Enter Or keyData = Keys.Tab) Then '' End EditMode, then raise event, so the standard-handler can run and the refocus is being done Me.EndEdit() OnKeyDown(New KeyEventArgs(keyData)) Return True End If ''Default Return MyBase.ProcessCmdKey(msg, keyData) End Function


Intenté esto para cambiar el comportamiento de entrada para su cuadrícula al heredar una columna personalizada de la columna de cuadro de texto y anular el evento a continuación

protected override bool ProcessDialogKey(Keys keyData) { if (keyData == Keys.Enter) return base.ProcessDialogKey(Keys.Tab); else return base.ProcessDialogKey(keyData); }

Entonces, en lugar de enviar la clave Enter, emula la acción de Tab que se moverá a la siguiente celda. Espero que esto ayude


Sé que esta pregunta fue hecha hace mucho tiempo, pero la respuesta puede ser útil para aquellos que buscan en el futuro, espero que sí. la mejor solución es usar su columna personalizada y para el cuadro de texto es fácil porque aprovecharemos las clases incorporadas

class Native { public const uint WM_KEYDOWN = 0x100; [DllImport("user32.dll")] public static extern bool PostMessage(IntPtr hWnd, UInt32 Msg, Int32 wParam, Int32 lParam); } //the column that will be added to dgv public class CustomTextBoxColumn : DataGridViewColumn { public CustomTextBoxColumn() : base(new CustomTextCell()) { } public override DataGridViewCell CellTemplate { get { return base.CellTemplate; } set { if (value != null && !value.GetType().IsAssignableFrom(typeof(CustomTextCell))) { throw new InvalidCastException("Must be a CustomTextCell"); } base.CellTemplate = value; } } } //the cell used in the previous column public class CustomTextCell : DataGridViewTextBoxCell { public override Type EditType { get { return typeof(CustomTextBoxEditingControl); } } } //the edit control that will take data from user public class CustomTextBoxEditingControl : DataGridViewTextBoxEditingControl { protected override void WndProc(ref Message m) { //we need to handle the keydown event if (m.Msg == Native.WM_KEYDOWN) { if((ModifierKeys&Keys.Shift)==0)//make sure that user isn''t entering new line in case of warping is set to true { Keys key=(Keys)m.WParam; if (key == Keys.Enter) { if (this.EditingControlDataGridView != null) { if(this.EditingControlDataGridView.IsHandleCreated) { //sent message to parent dvg Native.PostMessage(this.EditingControlDataGridView.Handle, (uint)m.Msg, m.WParam.ToInt32(), m.LParam.ToInt32()); m.Result = IntPtr.Zero; } return; } } } } base.WndProc(ref m); } }

luego llegamos al dgv en sí, utilicé una nueva clase derivada de DataGridView y agregué mis columnas y manejé la tecla enter desde wndproc también

void Initialize() { CustomTextBoxColumn colText = new CustomTextBoxColumn(); colText.DataPropertyName = colText.Name = columnTextName; colText.HeaderText = columnTextAlias; colText.DefaultCellStyle.WrapMode = DataGridViewTriState.True; this.Columns.Add(colText); DataGridViewTextBoxColumn colText2 = new DataGridViewTextBoxColumn(); colText2.DataPropertyName = colText2.Name = columnText2Name; colText2.HeaderText = columnText2Alias; colText2.DefaultCellStyle.WrapMode = DataGridViewTriState.False; this.Columns.Add(colText2); } protected override void WndProc(ref Message m) { //the enter key is sent by edit control if (m.Msg == Native.WM_KEYDOWN) { if ((ModifierKeys & Keys.Shift) == 0) { Keys key = (Keys)m.WParam; if (key == Keys.Enter) { MoveToNextCell(); m.Result = IntPtr.Zero; return; } } } base.WndProc(ref m); } //move the focus to the next cell in same row or to the first cell in next row then begin editing public void MoveToNextCell() { int CurrentColumn, CurrentRow; CurrentColumn = this.CurrentCell.ColumnIndex; CurrentRow = this.CurrentCell.RowIndex; if (CurrentColumn == this.Columns.Count - 1 && CurrentRow != this.Rows.Count - 1) { this.CurrentCell = Rows[CurrentRow + 1].Cells[1];//0 index is for No and readonly this.BeginEdit(false); } else if(CurrentRow != this.Rows.Count - 1) { base.ProcessDataGridViewKey(new KeyEventArgs(Keys.Tab)); this.BeginEdit(false); } }


Si necesita cerrar el formulario al ingresar, puede usar el siguiente código. Supongo que la cuadrícula es de solo lectura y no es necesario que distinga la situación en la que se presionó la tecla enter.

public class DataGridViewNoEnter : DataGridView { protected override bool ProcessDataGridViewKey(KeyEventArgs e) { if (e.KeyCode == Keys.Enter) { ((Form)this.TopLevelControl).DialogResult = DialogResult.OK; return false; } return base.ProcessDataGridViewKey(e); } }


Simplemente haz que funcione bien.

private void dataGridViewX1_CellEndEdit(object sender, DataGridViewCellEventArgs e) { SendKeys.Send("{UP}"); SendKeys.Send("{Right}"); }


Puedes hacerlo simplemente ...

1 ... Cree el evento KeyDown para esa vista de cuadrícula. (Vaya a propiedades en la vista de cuadrícula y haga doble clic en el evento KeyDown).

2 ... Pasado este código -

if(e.KeyData == Keys.Enter) { e.Handled = true; }

3 ... Finalmente se ve así.

private void dgvSearchResults_KeyDown(object sender, KeyEventArgs e) { if (e.KeyData == Keys.Enter) { e.Handled = true; } }

4. Ejecute el programa y vea.


Private Sub DataGridView1_KeyDown(sender As Object, e As KeyEventArgs) Handles DataGridView1.KeyDown If e.KeyData = Keys.Enter Then e.Handled = True End Sub

Es solo una solución, no una solución real, pero funciona.