c# - property - Numeric TextBox
textbox only numbers wpf (13)
Soy nuevo en la programación y no sé mucho sobre pero estoy haciendo una calculadora, y quiero usar un cuadro de texto que solo acepte números y decimales, y cuando el usuario pegue texto del portapapeles, el cuadro de texto borra cualquier carácter literal, como el MS calc.
Por favor, tómese el tiempo para explicar cada parte para que pueda aprender o escribir y decirme qué buscar.
Gracias
EDITAR: Lo haré más específico:
¿Cómo puedo hacer un cuadro de texto numérico en C #? He usado el cuadro de texto enmascarado pero no tomará decimales.
He leído cosas sobre la sobrecarga del método OnKeyPress, por lo que corregirá los caracteres incorrectos, pero no sé cómo hacerlo.
Como novato, es mejor que inviertas en un buen juego de herramientas de terceros. Radcontrols de Telerik, por ejemplo, tiene un cuadro de texto numérico que logrará lo que está buscando.
Hay un control en el marco que está especialmente hecho para la entrada numérica: el control NumericUpDown. También administra valores decimales.
Investigue el MaskedTextBox.
La pregunta es un poco amplia para explicar todo. Intenta enfocar la pregunta si quieres detalles porque estás pidiendo a mucha comunidad que "explique cada parte". Si hace algunas preguntas específicas (y excluye el "por favor, el momento de explicar ..."), obtendrá mejores respuestas.
Podría usar un cuadro de texto simple o una etiqueta como la pantalla de la calculadora y simplemente asegurarse de que el valor (¿una cadena?) Siempre sea un número. Por ejemplo, puede mantener un doble y convertirlo a una cadena cuando desee visualizarlo.
Por lo que sé, no hay nada nativo en .NET Framework (2.0 al menos) para hacer esto. Tus opciones serían:
- Cree un control personalizado que hereda del control de cuadro de texto y solo permite la entrada numérica. Esto tiene la ventaja de que el control puede reutilizarse.
- Maneje el evento KeyPress y verifique el código de caracteres para permitir solo las teclas numéricas. Esto es más fácil pero mucho menos reutilizable.
Probablemente usaría una expresión regular para descartar elementos no numéricos.
pseudo código:
for (each item in the input string) {
if (!match(some regular expression, item)) {
toss it out
} else {
add item to text box or whatever you were going to do with it
}
}
Si observa detenidamente, en la Calculadora de Windows, los números se muestran en una etiqueta, no en un cuadro de texto (No recibe el foco). La ventana recibe eventos de teclado.
Así que mira los eventos KeyPressed y KeyDown en el formulario.
aquí cómo hacer esto en vb.net
Private Sub TextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox1.TextChanged
Dim reg As New System.Text.RegularExpressions.Regex("[^0-9_ ]")
TextBox1.Text = reg.Replace(TextBox1.Text, "")
End Sub
solo arregle la expresión regular para sus necesidades específicas
Agregue un controlador de eventos para el cuadro de texto que desea que sea solo numérico y agregue el siguiente código:
private void textBoxNumbersOnly_KeyPress(object sender, KeyPressEventArgs e)
{
if (Char.IsDigit(e.KeyChar) || e.KeyChar == ''/b'')
{
e.Handled = false;
}
else
{
e.Handled = true;
}
}
Esto permite números de 0 a 9, y también espacios de retroceso (útil en mi humilde opinión). Permitir a través de ''.'' personaje si quieres apoyar decimales
if ("1234567890".IndexOf(e.KeyChar.ToString()) > 0)
{
e.Handled = false;
}
else
{
e.Handled = true;
}
útil para la entrada numérica decimal pero tiene algunos errores si (clic derecho y pega) el otro texto. :RE
private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
{
string original = (sender as TextBox).Text;
if (!char.IsDigit(e.KeyChar))
{
e.Handled = true;
}
if (e.KeyChar == ''.'')
{
if (original.Contains(''.''))
e.Handled = true;
else if (!(original.Contains(''.'')))
e.Handled = false;
}
else if (char.IsDigit(e.KeyChar)||e.KeyChar==''/b'')
{
e.Handled = false;
}
}
La forma más fácil :)
en el evento Keypress en su cuadro de texto
if ((e.KeyChar <= 57 && e.KeyChar >= 48) || e.KeyChar == 13 || e.KeyChar == 8)
{
}
else
{
e.Handled = true;
}
Aquí hay un control personalizado que hice basado en la respuesta de Mahasen . Póngalo en su propio archivo de clase y arregle el espacio de nombres para lo que desee. Una vez que reconstruya su solución, debería aparecer como un nuevo control en la pestaña del menú de la Caja de Herramientas que puede arrastrar / soltar en un Form
.
using System;
using System.Linq;
using System.Windows.Forms;
namespace MyApp.GUI
{
public class FilteredTextBox : TextBox
{
// Fields
private char[] m_validCharacters;
private string m_filter;
private event EventHandler m_maxLength;
// Properties
public string Filter
{
get
{
return m_filter;
}
set
{
m_filter = value;
m_validCharacters = value.ToCharArray();
}
}
// Constructor
public FilteredTextBox()
{
m_filter = "";
this.KeyPress += Validate_Char_OnKeyPress;
this.TextChanged += Check_Text_Length_OnTextChanged;
}
// Event Hooks
public event EventHandler TextBoxFull
{
add { m_maxLength += value; }
remove { m_maxLength -= value; }
}
// Methods
void Validate_Char_OnKeyPress(object sender, KeyPressEventArgs e)
{
if (m_validCharacters.Contains(e.KeyChar) || e.KeyChar == ''/b'')
e.Handled = false;
else
e.Handled = true;
}
void Check_Text_Length_OnTextChanged(object sender, EventArgs e)
{
if (this.TextLength == this.MaxLength)
{
var Handle = m_maxLength;
if (Handle != null)
Handle(this, EventArgs.Empty);
}
}
}
}
y solo como una bonificación, quería que se auto-tabulara en otra casilla después de ingresar 3 caracteres, por lo que puse la longitud máxima de la caja en 3 y en el código del Form
enganché ese evento TextBoxFull y me centré en el cuadro al lado. Esto fue para encadenar 4 cajas filtradas juntas para ingresar una dirección IP. El código del formulario para los dos primeros recuadros está debajo ...
private bool ValidateAddressChunk(string p_text)
{
byte AddressChunk = new byte();
return byte.TryParse(p_text, out AddressChunk);
}
private void filteredTextBox1_TextBoxFull(object sender, EventArgs e)
{
var Filtered_Text_Box = (FilteredTextBox)sender;
if (!ValidateAddressChunk(Filtered_Text_Box.Text))
filteredTextBox1.Text = "255";
else
filteredTextBox2.Focus();
}
private void filteredTextBox2_TextBoxFull(object sender, EventArgs e)
{
var Filtered_Text_Box = (FilteredTextBox)sender;
if (!ValidateAddressChunk(Filtered_Text_Box.Text))
filteredTextBox2.Text = "255";
// etc.
}