keychar evento c# winforms keyboard user-input

c# - evento - Manejo de entrada en WinForm



keypress c# textbox (5)

Así es como manejo esto por lo general.

Regex regex = new Regex("[0-9]|/b"); e.Handled = !(regex.IsMatch(e.KeyChar.ToString()));

Eso solo permitirá caracteres numéricos y el retroceso. El problema es que no se le permitirá usar claves de control en este caso. Crearía mi propia clase de cuadro de texto si desea mantener esa funcionalidad.

¿Cuál es la mejor manera de bloquear el uso de ciertas teclas de entrada en un TextBox sin bloquear las teclas especiales como Ctrl-V / Ctrl-C?

Por ejemplo, solo permite al usuario ingresar un subconjunto de caracteres o números como A o B o C y nada más.


Puede usar el evento TextChanged para el cuadro de texto.

private void txtInput_TextChanged(object sender, EventArgs e) { if (txtInput.Text.ToUpper() == "A" || txtInput.Text.ToUpper() == "B") { //invalid entry logic here } }


Usaría el evento keydown y usaré e.cancel para detener la clave si la clave no está permitida. Si quiero hacerlo en varios lugares, entonces haré un control de usuario que herede un cuadro de texto y luego agregaré una propiedad AllowedChars o DisallowedChars que lo maneje por mí. Tengo un par de variantes por ahí que uso de vez en cuando, algunas permiten el formateo y entrada de dinero, algunas para la edición de tiempo, etc.

Lo bueno de hacerlo como control de usuario es que puede agregarlo y llegar a su propio cuadro de texto asesino. ;)


Usé el control Masked Textbox para winforms. Hay una explicación más extensa al respecto aquí . Básicamente, no permite entradas que no coinciden con los criterios para el campo. Si no quieres que la gente escriba nada más que números, simplemente no les permitirá escribir nada más que números.


Encontré que la única solución que funcionaba era hacer una comprobación previa de la tecla presionada en ProcessCmdKey para Ctrl-V, Ctrl-C, Delete o Backspace, y hacer otra validación si no era una de estas teclas en el evento KeyPress. mediante el uso de una expresión regular.

Probablemente esta no sea la mejor manera, pero funcionó en mi circunstancia.

protected override bool ProcessCmdKey(ref Message msg, Keys keyData) { // check the key to see if it should be handled in the OnKeyPress method // the reasons for doing this check here is: // 1. The KeyDown event sees certain keypresses differently, e.g NumKeypad 1 is seen as a lowercase A // 2. The KeyPress event cannot see Modifer keys so cannot see Ctrl-C,Ctrl-V etc. // The functionality of the ProcessCmdKey has not changed, it is simply doing a precheck before the // KeyPress event runs switch (keyData) { case Keys.V | Keys.Control : case Keys.C | Keys.Control : case Keys.X | Keys.Control : case Keys.Back : case Keys.Delete : this._handleKey = true; break; default: this._handleKey = false; break; } return base.ProcessCmdKey(ref msg, keyData); } protected override void OnKeyPress(KeyPressEventArgs e) { if (String.IsNullOrEmpty(this._ValidCharExpression)) { this._handleKey = true; } else if (!this._handleKey) { // this is the final check to see if the key should be handled // checks the key code against a validation expression and handles the key if it matches // the expression should be in the form of a Regular Expression character class // e.g. [0-9/./-] would allow decimal numbers and negative, this does not enforce order, just a set of valid characters // [A-Za-z0-9/-_/@/.] would be all the valid characters for an email this._handleKey = Regex.Match(e.KeyChar.ToString(), this._ValidCharExpression).Success; } if (this._handleKey) { base.OnKeyPress(e); this._handleKey = false; } else { e.Handled = true; } }