form - fill datagridview c#
Aumente CellValueChanged desde un control de ediciĆ³n personalizado en un DataGridView (1)
¿Cuál es el objetivo aquí? Parece que estás intentando crear una máscara de teclado, donde cualquier personaje no confirmante genera una alerta. Si es así, puede encontrar la felicidad en DataGridView agregando un MaskedTextBoxColumn. Un MaskedTextBoxColumn controla la entrada de una manera mucho más razonable que forzar las confirmaciones de edición.
Consulte aquí el código que muestra cómo usarlo: http://msdn.microsoft.com/en-us/library/ms180996.aspx
De acuerdo con los criterios actualizados en los comentarios, parece que su solución es probablemente tan buena como la obtendrá. Tenga en cuenta, sin embargo, que es muy fácil ingresar en bucles infinitos de eventos cuando tiene otros controles actualizando en otro basado en eventos de teclado. Probablemente sea mejor tener un único delegado en el formulario que maneja todos los eventos, ya que puede evitar bucles infinitos de desencadenantes de eventos descartando eventos espurios en función del estado.
Efectivamente, esto utilizaría el patrón de Model View Presenter, donde su delegado actúa como presentador y administra el tráfico en su View (su UI).
Al hacer esto, incluso puede mover la lógica de Presenter a una nueva clase a la que luego se enlazarán los datos, lo que le permite controlar completamente la UI desde una construcción lógica, en lugar de un batiburrillo de controladores de eventos.
Tengo un DataGridView (WinForms) en el que he definido un EditingControl personalizado derivado de DataGridViewTextBoxEditingControl que solo permite caracteres numéricos.
Necesito elevar el evento CellValueChanged en el DataGridView cada vez que el usuario presiona una tecla, pero el comportamiento predeterminado es plantear el evento solo cuando la edición se ha completado.
¿Cómo puedo plantear el evento cada vez que se presiona una tecla?
public class DataGridViewNumericTextBoxEditingControl : DataGridViewTextBoxEditingControl
{
protected override void OnKeyPress(KeyPressEventArgs e)
{
e.Handled = Char.IsLetter(e.KeyChar);
if (!e.Handled)
RaiseDataGridViewCellValueChanged(); // <-- Any way?
}
}
Actualizar:
Encontré una solución, pero no estoy seguro de que sea una buena solución:
public class DataGridViewNumericTextBoxEditingControl : DataGridViewTextBoxEditingControl
{
protected override void OnKeyPress(KeyPressEventArgs e)
{
e.Handled = Char.IsLetter(e.KeyChar);
if (!e.Handled)
{
EditingControlDataGridView.EndEdit();
EditingControlDataGridView.BeginEdit(false);
}
}
}