una solo propiedades permitir net manualmente editar edicion datos columna bloquear agregar .net winforms datagridview

.net - propiedades - permitir editar solo una columna datagridview



Captura del primer caracter al ingresar al modo de edición: control de edición personalizado en DataGridView (4)

Intente configurar KeyPreview del control de usuario en verdadero. Luego, compruebe si la tecla que inicia el proceso de edición dispara la tecla incluso para el control del usuario. Si lo hace, simplemente puede almacenar y asignar el carácter una vez que el control de texto ingrese al modo de edición.

Estoy alojando un control de edición personalizado en un DataGridView , que para el registro es un TextBox y Button juntos en un UserControl . He heredado de DataGridViewColumn para la nueva columna y DataGridViewTextBoxCell para la nueva celda.

Con un DataGridViewTextBoxCell normal, si presiona una tecla cuando la celda tiene foco, comenzará el modo de edición y el carácter que escribió aparecerá en TextBoxEditingControl . Sin embargo, en mi celda heredada, no se transmite ningún valor en la pulsación de tecla. (De hecho, tiene que pasar manualmente el valor actual de la celda en InitializeEditingControl o no aparecerá nada). Por lo tanto, el primer carácter que escriba (el que comienza el modo de edición) se perderá.

He intentado OnKeyPress , OnKeyDown y OnKeyUp en DataGridViewCell pero nunca se llaman. KeyEntersEditMode , sin embargo, parece que se llama, y ​​solo cuando se compara con una tecla presionada, por lo que este podría ser un buen lugar para comenzar. El problema entonces se convierte en cómo traducir KeyEventArgs a un char . Esto es trivial para el alfabeto y los números, pero como no todos los teclados son iguales, manejar otras teclas es desordenado y complicado en el mejor de los casos. Si hay una clase de convertidor que hará esto automágicamente, por favor ilumíname.

¿Alguien más ha encontrado este problema o ha encontrado una buena solución?

Nota: Este problema se aplica cuando EditMode se establece en cualquier variación de EditOnKeystroke . Establecer en EditOnEnter es una solución válida para mi proyecto, pero también me gustaría emular el comportamiento predeterminado del TextBoxEditingControl .


Mi solución es anular OnKeyPress en UserControl personalizado.

protected override void OnKeyPress(KeyPressEventArgs e) { _textBox.Text = e.KeyChar.ToString(); _textBox.SelectionStart = 1; _textBox.SelectionLength = 0; base.OnKeyPress(e); }


Hola hoy tuve el mismo problema. Mi solución es anular KeyEntersEditMode en CustomCell y poner allí algún algoritmo para convertir o determinar si un carácter es válido para pasar al control de edición. Luego guardo este valor como una variable privada. Anulo el método InitializeEditingControl y uso mi valor almacenado como el valor inicial para el control. Después de usarlo lo configuré en nulo para que luego nada lo usara.

private string startString; public override bool KeyEntersEditMode(KeyEventArgs e) { var result = base.KeyEntersEditMode(e); if (e.KeyData == Keys.D1) { startString = "1"; } return result; } public override void InitializeEditingControl(int rowIndex, object initialFormattedValue, DataGridViewCellStyle dataGridViewCellStyle) { if(startString != null) { initialFormattedValue = startString; startString = null; } base.InitializeEditingControl(rowIndex, initialFormattedValue, dataGridViewCellStyle); var c = this.DataGridView.EditingControl as MyEditingControl; string initialFormattedValueStr = initialFormattedValue as string; if (initialFormattedValueStr == null) { c.Text = string.Empty; } else { c.Text = initialFormattedValueStr; c.SelectionStart = initialFormattedValueStr.Length; } }


Para obtener el primer caracter en su TextBox haga esto:

1) Agregue "Imports System.Runtime.InteropServices" o use si prefiere C #

2) Agregar asignación a SendMessage en user32.dll

VB.Net example: <DllImport("user32.dll", SetLastError:=True, CharSet:=CharSet.Auto)> _ Private Shared Function SendMessage(ByVal hWnd As IntPtr, ByVal Msg As Integer, ByVal wParam As IntPtr, ByVal lParam As IntPtr) As IntPtr End Function C# example: [DllImport("USER32.DLL", CharSet = System.Runtime.InteropServices.CharSet.Auto)] private static extern IntPtr SendMessage(IntPtr hWnd, int msg, IntPtr wParam, IntPtr lParam);

3) Redirige la clave de tu TextBox desde UserControl

Protected Overrides Function ProcessKeyEventArgs(ByRef m As System.Windows.Forms.Message) As Boolean SendMessage(Me.ComboBox.Handle, m.Msg, m.WParam, m.LParam) Return True End Function protected override bool ProcessKeyEventArgs(ref Message m) { SendMessage(textBox.Handle, m.Msg, m.WParam, m.LParam); return true; }

4) Hay un ejemplo en la página de Microsoft con DataGridViewNumericUpDown aquí , descargue la fuente.

5) Hecho.