none
Detectar pulsaciones de teclas numericas RRS feed

  • Pregunta

  • Hola amigos, vengo por ayuda.

    Bien estoy haciendo un programa en windows form C#, mi ventana tiene 2 textbox y botones del 0 al 9 y 2 botones más uno de limpiar y borrar, bien mi texbox 1 tiene como evento el keyUp y mis botones el evento Click.

    Mi problema es que cuando introduzco valores con los botones que cree no me muestra el resultado automáticamente en el segundo textbox, y para escribir con las teclas del ordenador en el textbox 1 tengo que seleccionarlo y escribir ahí me muestra automáticamente el resultado.

    Alguien sabe como puede sincronizar las teclas numéricas con mis botones numéricos, así cuando apreté una tecla salga como si estuviera presionando un botón de mi ventana? 

    sábado, 20 de junio de 2020 18:17

Respuestas

  • Hola, deberías crear un manejado de teclas, asignarlo al formulario y establecer la propiedad KeyPreview a true para que sea el formulario el que primero procese las pulsaciones. Un ejemplo lo puedes ver Detectar pulsación de teclas en el formulario (y controles)

    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos

    sábado, 20 de junio de 2020 19:10
    Moderador
  • Hola Luis

    Ahora si entendí, recreé el programa, y lo que te estaba faltando era simplemente controlar el Evento TextChanged en el TextBox 1 y que en el método se realicen los mismos cálculos y escribir el resultado en el TextBox 2 que en el controlador del SelectedIndexChanged del ComboBox "de salida".

    Lo que retoqué en tu código, es:

    * Quitar tbxRound que no lo usabas.

    * Pasar a un método lo que hacía el método del Evento del ComboBox "de salida" y agregarlo en él y en el Evento TextChanged del TextBox 1. 

    * Un comentario que dice que el método del Evento KeyPress del Form lo que hace es dar un click automático a los botones de los dígitos.

    * Iniciar los SelectedIndex de ambos ComboBox en 0, así no comienzan los Text de los mismos vacíos, ya que su valor por defecto es -1.

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    
    namespace ConversorDeUnidades
    {
        public partial class Temperatura : Form
        {
            public Temperatura()
            {
                InitializeComponent();
                tbxValor1.Text = "0";
                //tbxRound.Text = "0";
                tbxValor2.Text = "0";
                cbxEntrada.SelectedIndex = 0;
                cbxSalida.SelectedIndex = 0;
            }
    
            // Botones esenciales
            private void btnClear_Click(object sender, EventArgs e)
            {
                tbxValor2.Text = "0";
                tbxValor1.Text = "0";
                //tbxRound.Text = "0";
                secuencia = true;
            }
    
            private void btnAtras_Click(object sender, EventArgs e)
            {
                tbxValor1.Text = tbxValor1.Text.Substring(0, tbxValor1.Text.Length - 1);
            }
    
            // Botones numericos
            bool secuencia = true;
            private void btn0_Click(object sender, EventArgs e)
            {
                if (tbxValor1.Text == "0")
                {
                    return;
                }
                else
                    tbxValor1.Text = tbxValor1.Text + "0";
            }
    
            private void btn1_Click(object sender, EventArgs e)
            {
                if (secuencia == true)
                {
                    tbxValor1.Text = "";
                    tbxValor1.Text = "1";
                    secuencia = false;
                }
                else
                {
                    tbxValor1.Text = tbxValor1.Text + "1";
                }
            }
    
            private void btn2_Click(object sender, EventArgs e)
            {
                if (secuencia == true)
                {
                    tbxValor1.Text = "";
                    tbxValor1.Text = "2";
                    secuencia = false;
                }
                else
                {
                    tbxValor1.Text = tbxValor1.Text + "2";
                }
            }
    
            private void btn3_Click(object sender, EventArgs e)
            {
                if (secuencia == true)
                {
                    tbxValor1.Text = "";
                    tbxValor1.Text = "3";
                    secuencia = false;
                }
                else
                {
                    tbxValor1.Text = tbxValor1.Text + "3";
                }
            }
    
            private void btn4_Click(object sender, EventArgs e)
            {
                if (secuencia == true)
                {
                    tbxValor1.Text = "";
                    tbxValor1.Text = "4";
                    secuencia = false;
                }
                else
                {
                    tbxValor1.Text = tbxValor1.Text + "4";
                }
            }
    
            private void btn5_Click(object sender, EventArgs e)
            {
                if (secuencia == true)
                {
                    tbxValor1.Text = "";
                    tbxValor1.Text = "5";
                    secuencia = false;
                }
                else
                {
                    tbxValor1.Text = tbxValor1.Text + "5";
                }
            }
    
            private void btn6_Click(object sender, EventArgs e)
            {
                if (secuencia == true)
                {
                    tbxValor1.Text = "";
                    tbxValor1.Text = "6";
                    secuencia = false;
                }
                else
                {
                    tbxValor1.Text = tbxValor1.Text + "6";
                }
            }
    
            private void btn7_Click(object sender, EventArgs e)
            {
                if (secuencia == true)
                {
                    tbxValor1.Text = "";
                    tbxValor1.Text = "7";
                    secuencia = false;
                }
                else
                {
                    tbxValor1.Text = tbxValor1.Text + "7";
                }
            }
    
            private void btn8_Click(object sender, EventArgs e)
            {
                if (secuencia == true)
                {
                    tbxValor1.Text = "";
                    tbxValor1.Text = "8";
                    secuencia = false;
                }
                else
                {
                    tbxValor1.Text = tbxValor1.Text + "8";
                }
            }
    
            private void btn9_Click(object sender, EventArgs e)
            {
                if (secuencia == true)
                {
                    tbxValor1.Text = "";
                    tbxValor1.Text = "9";
                    secuencia = false;
                }
                else
                {
                    tbxValor1.Text = tbxValor1.Text + "9";
                }
            }
            private void btnComa_Click(object sender, EventArgs e)
            {
                tbxValor1.Text = tbxValor1.Text + ",";
            }
    
            // Codigo para poder escribir en el textbox 1 sin tener que seleccionarlo.
            // NO, ERROR! Este código lo que hace es un click automático al botón del dígito pulsado
            private void Masa_KeyPress(object sender, KeyPressEventArgs e)
            {
                Button[] buttons = { btn0, btn1, btn2, btn3, btn4, btn5, btn6, btn7, btn8, btn9 };
    
                if (char.IsDigit(e.KeyChar))
                {
                    buttons[Convert.ToInt32(e.KeyChar.ToString())].PerformClick();
                }
            }
    
            // Codigo principal
            private double celsius;
            private void cbxSalida_SelectedIndexChanged(object sender, EventArgs e)
            {
                ConvertirTemperatura();
            }
    
            private void ConvertirTemperatura()
            {
                // Codigo de conversiones de unidades de Cesius a X unidad
                if (cbxEntrada.Text == "Celsius" && cbxSalida.Text == "Celsius")
                {
                    tbxValor2.Text = tbxValor1.Text;
                }
                else if (cbxEntrada.Text == "Celsius" && cbxSalida.Text == "Fahrenheit")
                {
                    celsius = (Convert.ToDouble(tbxValor1.Text) * 9) / 5 + 32;
                    tbxValor2.Text = celsius.ToString();
                }
                else if (cbxEntrada.Text == "Celsius" && cbxSalida.Text == "Kelvin")
                {
                    celsius = Convert.ToDouble(tbxValor1.Text) + 273.15;
                    tbxValor2.Text = celsius.ToString();
                }
                else if (cbxEntrada.Text == "Celsius" && cbxSalida.Text == "Rankine")
                {
                    celsius = (Convert.ToDouble(tbxValor1.Text) * 9) / 5 + 491.67;
                    tbxValor2.Text = celsius.ToString();
                }
                else if (cbxEntrada.Text == "Celsius" && cbxSalida.Text == "Réamur")
                {
                    celsius = (Convert.ToDouble(tbxValor1.Text) * 4) / 5;
                    tbxValor2.Text = celsius.ToString();
                }
                else if (cbxEntrada.Text == "Celsius" && cbxSalida.Text == "Newton")
                {
                    celsius = Convert.ToDouble(tbxValor1.Text) * 0.33000;
                    tbxValor2.Text = celsius.ToString();
                }
                else if (cbxEntrada.Text == "Celsius" && cbxSalida.Text == "Rømer")
                {
                    celsius = (Convert.ToDouble(tbxValor1.Text) / 1.904762) + 7.5;
                    tbxValor2.Text = celsius.ToString();
                }
                else if (cbxEntrada.Text == "Celsius" && cbxSalida.Text == "Delisle")
                {
                    celsius = (Convert.ToDouble(tbxValor1.Text) * 1.5000) - 100.00;
                    tbxValor2.Text = celsius.ToString();
                }
            }
    
            private void tbxValor1_TextChanged(object sender, EventArgs e)
            {
                if (tbxValor1.Text == "")
                    tbxValor1.Text = "0";
    
                ConvertirTemperatura();
            }
        }
    }

    Hay una forma de escribir un único controlador del Click para los botones con los dígitos, en lugar de 10, si te interesa decime.

    Saludos

    EDITO: 

    Recorda asociar el método de TextChanged al TextBox 1.

    lunes, 22 de junio de 2020 3:43
  • hola

    Piensas que definir un evento por cada boton btnXX_Click es correcto ?

    porque no pones el valor que representa cada boton en la propiedad Tag y despues asignas el mismo evento Click a todos los botones

    entonces quedaria mas simple y no repites siempre lo mismo

            private void btnXX_Click(object sender, EventArgs e)
            {
                string valor = ((Button)sender).Tag.ToString();
    
                if (secuencia)
                {
                    tbxValor1.Text = "";
                    tbxValor1.Text = valor;
                    secuencia = false;
                }
                else
                {
                    tbxValor1.Text = tbxValor1.Text + valor;
                }
            }


    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    lunes, 22 de junio de 2020 4:24

Todas las respuestas

  • Hola, deberías crear un manejado de teclas, asignarlo al formulario y establecer la propiedad KeyPreview a true para que sea el formulario el que primero procese las pulsaciones. Un ejemplo lo puedes ver Detectar pulsación de teclas en el formulario (y controles)

    Si se solucionó tu consulta no olvides marcar la respuesta. Si te ayudó, vótala como útil. Saludos

    sábado, 20 de junio de 2020 19:10
    Moderador
  • Gracias amigo, voy hacer eso entonces te aviso si funcionó 😁
    sábado, 20 de junio de 2020 19:27
  • hola

    >>mi ventana tiene 2 textbox y botones del 0 al 9 y 2 botones más uno de limpiar y borrar,

    es una calculadora?

    >>Alguien sabe como puede sincronizar las teclas numéricas con mis botones numéricos, así cuando apreté una tecla salga como si estuviera presionando un botón de mi ventana?

    Mas alla de usar eventos como ser KeyPress en el form deberas tener en cuenta de poner el foco en el textbox correcto para que ingrese el valor alli

    usa el

    Form.ProcessCmdKey(Message, Keys) Method

    para capturar las teclas que se presione

    protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
    {
        if (keyData < Keys.D0 || keyData > Keys.D9)
        {
    	//codigo
        }
        
    
        if (keyData < Keys.NumPad0 || keyData > Keys.NumPad9)
        {
    	//codigo
        }
    
        return true;
    }


    Keys Enum

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    sábado, 20 de junio de 2020 22:54
  • Hola Luis

    Podes controlar el evento KeyPress del Form, y si se pulsó un dígito, hacer un click automático (con el método PerformClick()) en el botón correspondiente.

    private void Form1_KeyPress(object sender, KeyPressEventArgs e)
    {
        Button[] buttons = { 
            button0, button1, button2, button3, button4, 
            button5, button6, button7, button8, button9    
        };
    
        if (Char.IsDigit(e.KeyChar))
            buttons[Convert.ToInt32(e.KeyChar.ToString())].PerformClick();
    }

    1ro, hacemos un array de Button para poder usarlos con un índice, que será el mismo dígito pulsado. 

    Luego, si se pulsó un dígito, se hace un click automático en el Button cuyo dígito se pulsó.

    Era esto solo? Si falta algo más decime ...

    Saludos

    Pablo


    domingo, 21 de junio de 2020 4:42
  • Gracias Pablo tu codigo me ayudó, ahora puedo escribir en el textbox sin tener que seleccionarlo, pero aún tengo un problema.

    Bien cuando meto un valor con mi botones que cree no me muestra el resultado automáticamente pero si lo hago con mis teclas del teclado del ordenador si me muestra, la verdad no se que puede ser 

    domingo, 21 de junio de 2020 18:46
  • Hola Luis

    Bien cuando meto un valor con mi botones que cree no me muestra el resultado automáticamente pero si lo hago con mis teclas del teclado del ordenador si me muestra, la verdad no se que puede ser 

    Qué es "no me muestra el resultado automáticamente"? Cuál resultado? Dónde?

    Podrías explicarme bien bien bien detallado qué es lo que esperas que haga, especificando controles (TextBox, Button, etc.), de dónde sale el "resultado", y todos los detalles, y qué es lo que hace que está mal? Quizás si mostras el código podría ser más fácil detectar el error. 

    domingo, 21 de junio de 2020 22:40
  • hola

    >>cuando meto un valor con mi botones que cree no me muestra el resultado automáticamente pero si lo hago con mis teclas del teclado del ordenador

    pero que codigo pones en el evento click de los botones ?

    tanto uses el KeyPress, ProcessCmdKey, etc estos escriben en el textbox

    pero ademas de eso tambien debes definir el click de cada boton poniendo el valor que representan en el textbox

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    domingo, 21 de junio de 2020 22:46
  • hola

    >>tengo botones numericos del 0 al 9 y 1 de limpiar todo

    Para que necesitas los botones si puedes escribir directo en el textbox?

    quizas serian validos los botones si tendras Label para mostrar los datos, pero con textbox no se necesitan, pones el foco en el textbox y escribes, para que complicarse

    >>If(tbxValor1 == "0"); return;

    te falta el .Text debes suar tbxValor1.Text para comparar

    no te olvides de definir las propiedades

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    domingo, 21 de junio de 2020 23:15
  • De dónde sale el "resultado"? Cómo se calcula? Dónde hay que mostrarlo? Supongo, por lo que leí hasta ahora, que en el TextBox 1 metes los dígitos y en el TextBox 2 queres ver un resultado, pero cómo, cuándo, y cuál?

    Si no nos brindas la información referente al programa, es imposible ayudarte.

    Y tenes que agregar .Text a tbxValor1, como te dijo Leandro, si no te producirá errores de compilación.

    EDITO:

    Si usaste el código que te pasé, y con las teclas te funciona, con los botones también debería, porque cuando pulsas un dígito (0-9) es como si hubieses clickeado el botón correspondiente.

    EDITO OTRA VEZ

    Esto:

    Private void btn0_Click(objec sender, eventArgs e){

    If(tbxValor1.Text == "0"); return;

    else tbxValor1 = TbxValor1 + "0";

    }

    En el método anterior si Text == "0" no hace nada, YA QUE A LA SENTENCIA IF LE SIGUE UNA INSTRUCCION VACIA (;). Por lo tanto el return se ejecutará siempre, con lo cual el método no hará nada nunca. Ahora, si es un error de tipeo, por favor, trata de mostrarnos el código como va y tal cual, si no, otra vez, se nos hace difícil ayudar. La sentencia vacía es útil, raramente, por ejemplo cuando se busca un cierto índice en un array, y obviamente, no es un error de sintaxis. Su uso inapropiado puede producir errores conceptuales importantes.

    Ahora veo también, que el else es incorrecto, porque la anterior sentencia no es el if sino el return. Por favor, mostranos el código bien, como lo tenes en tu IDE de VS, con Copy y Paste, porque, otra vez, si no, se nos complica mucho ayudarte. Además, lo que ya dijo Leandro, falta el .Text a tbxValor1. ¿Cuántos errores de compilación te generó todo ese código? 

    domingo, 21 de junio de 2020 23:49
  • Ok. Pablo entonces voy a publicar el código para que lo vean y me puedan a ayudar.

    lunes, 22 de junio de 2020 0:29
  • using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows.Forms;

    namespace ConversorDeUnidades
    {
        public partial class Temperatura : Form
        {
            public Temperatura()
            {
                InitializeComponent();
                tbxValor1.Text = "0";
                tbxRound.Text = "0";            
                tbxValor2.Text = "0";
            }  

            // Botones esenciales
            private void btnClear_Click(object sender, EventArgs e)
            {
                tbxValor2.Text = "0";
                tbxValor1.Text = "0";
                tbxRound.Text = "0";
                secuencia = true;
            }

            private void btnAtras_Click(object sender, EventArgs e)
            {
                tbxValor1.Text = tbxValor1.Text.Substring(0, tbxValor1.Text.Length - 1);
            }

            // Botones numericos
            bool secuencia = true;
            private void btn0_Click(object sender, EventArgs e)
            {
                if (tbxValor1.Text == "0")
                {
                    return;
                }
                else
                tbxValor1.Text = tbxValor1.Text + "0";
            }

            private void btn1_Click(object sender, EventArgs e)
            {
                if (secuencia == true)
                {
                    tbxValor1.Text = "";
                    tbxValor1.Text = "1";
                    secuencia = false;
                }
                else
                {
                    tbxValor1.Text = tbxValor1.Text + "1";
                }
            }

            private void btn2_Click(object sender, EventArgs e)
            {
                if (secuencia == true)
                {
                    tbxValor1.Text = "";
                    tbxValor1.Text = "2";
                    secuencia = false;
                }
                else
                {
                    tbxValor1.Text = tbxValor1.Text + "2";
                }
            }

            private void btn3_Click(object sender, EventArgs e)
            {
                if (secuencia == true)
                {
                    tbxValor1.Text = "";
                    tbxValor1.Text = "3";
                    secuencia = false;
                }
                else
                {
                    tbxValor1.Text = tbxValor1.Text + "3";
                }
            }

            private void btn4_Click(object sender, EventArgs e)
            {
                if (secuencia == true)
                {
                    tbxValor1.Text = "";
                    tbxValor1.Text = "4";
                    secuencia = false;
                }
                else
                {
                    tbxValor1.Text = tbxValor1.Text + "4";
                }
            }

            private void btn5_Click(object sender, EventArgs e)
            {
                if (secuencia == true)
                {
                    tbxValor1.Text = "";
                    tbxValor1.Text = "5";
                    secuencia = false;
                }
                else
                {
                    tbxValor1.Text = tbxValor1.Text + "5";
                }
            }

            private void btn6_Click(object sender, EventArgs e)
            {
                if (secuencia == true)
                {
                    tbxValor1.Text = "";
                    tbxValor1.Text = "6";
                    secuencia = false;
                }
                else
                {
                    tbxValor1.Text = tbxValor1.Text + "6";
                }
            }

            private void btn7_Click(object sender, EventArgs e)
            {
                if (secuencia == true)
                {
                    tbxValor1.Text = "";
                    tbxValor1.Text = "7";
                    secuencia = false;
                }
                else
                {
                    tbxValor1.Text = tbxValor1.Text + "7";
                }
            }

            private void btn8_Click(object sender, EventArgs e)
            {
                if (secuencia == true)
                {
                    tbxValor1.Text = "";
                    tbxValor1.Text = "8";
                    secuencia = false;
                }
                else
                {
                    tbxValor1.Text = tbxValor1.Text + "8";
                }
            }

            private void btn9_Click(object sender, EventArgs e)
            {
                if (secuencia == true)
                {
                    tbxValor1.Text = "";
                    tbxValor1.Text = "9";
                    secuencia = false;
                }
                else
                {
                    tbxValor1.Text = tbxValor1.Text + "9";
                }
            }
            private void btnComa_Click(object sender, EventArgs e)
            {
                tbxValor1.Text = tbxValor1.Text + ",";
            }

            // Codigo para poder escribir en el textbox 1 sin tener que seleccionarlo.
            private void Masa_KeyPress(object sender, KeyPressEventArgs e)
            {
                Button[] buttons = { btn0, btn1, btn2, btn3, btn4, btn5, btn6, btn7, btn8, btn9};

                if (char.IsDigit(e.KeyChar))
                {
                    buttons[Convert.ToInt32(e.KeyChar.ToString())].PerformClick();
                } 
            } 

            // Codigo principal
            private double celsius;
            private void cbxSalida_SelectedIndexChanged(object sender, EventArgs e)
            {
                // Codigo de conversiones de unidades de Cesius a X unidad
                if (cbxEntrada.Text == "Celsius" && cbxSalida.Text == "Celsius")
                {
                    tbxValor2.Text = tbxValor1.Text;
                }
                else if (cbxEntrada.Text == "Celsius" && cbxSalida.Text == "Fahrenheit")
                {
                    celsius = (Convert.ToDouble(tbxValor1.Text) * 9) / 5 + 32;
                    tbxValor2.Text = celsius.ToString();
                }
                else if (cbxEntrada.Text == "Celsius" && cbxSalida.Text == "Kelvin")
                {
                    celsius = Convert.ToDouble(tbxValor1.Text) + 273.15;
                    tbxValor2.Text = celsius.ToString();
                }
                else if (cbxEntrada.Text == "Celsius" && cbxSalida.Text == "Rankine")
                {
                    celsius = (Convert.ToDouble(tbxValor1.Text) * 9) / 5 + 491.67;
                    tbxValor2.Text = celsius.ToString();
                }
                else if (cbxEntrada.Text == "Celsius" && cbxSalida.Text == "Réamur")
                {
                    celsius = (Convert.ToDouble(tbxValor1.Text) * 4) / 5;
                    tbxValor2.Text = celsius.ToString();
                }
                else if (cbxEntrada.Text == "Celsius" && cbxSalida.Text == "Newton")
                {
                    celsius = Convert.ToDouble(tbxValor1.Text) * 0.33000;
                    tbxValor2.Text = celsius.ToString();
                }
                else if (cbxEntrada.Text == "Celsius" && cbxSalida.Text == "Rømer")
                {
                    celsius = (Convert.ToDouble(tbxValor1.Text) / 1.904762) + 7.5;
                    tbxValor2.Text = celsius.ToString();
                }
                else if (cbxEntrada.Text == "Celsius" && cbxSalida.Text == "Delisle")
                {
                    celsius = (Convert.ToDouble(tbxValor1.Text) * 1.5000) - 100.00;
                    tbxValor2.Text = celsius.ToString();
                }
           }

    BIEN TODO ESE ES EL CODIGO, LA VENTANA TIENE ACTIVADO EL KEYPREVIEW, PARA SER MAS ESPECIFICO LO QUE QUIERO HACER ES ALGO COMO LA CALCULADORA DE WINDOWS EN MODO CONVERSOR, DONDE PONES VALORES NUMERICOS CON LOS BOTONES Y VA CONVIRTIENDO AUTOMATICAMENTE. NO SE SI LA HAS USADO PABLO, PERO ALGO ASI DESEO.

                
    lunes, 22 de junio de 2020 0:47
  • Hola Luis

    Ahora si entendí, recreé el programa, y lo que te estaba faltando era simplemente controlar el Evento TextChanged en el TextBox 1 y que en el método se realicen los mismos cálculos y escribir el resultado en el TextBox 2 que en el controlador del SelectedIndexChanged del ComboBox "de salida".

    Lo que retoqué en tu código, es:

    * Quitar tbxRound que no lo usabas.

    * Pasar a un método lo que hacía el método del Evento del ComboBox "de salida" y agregarlo en él y en el Evento TextChanged del TextBox 1. 

    * Un comentario que dice que el método del Evento KeyPress del Form lo que hace es dar un click automático a los botones de los dígitos.

    * Iniciar los SelectedIndex de ambos ComboBox en 0, así no comienzan los Text de los mismos vacíos, ya que su valor por defecto es -1.

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    
    namespace ConversorDeUnidades
    {
        public partial class Temperatura : Form
        {
            public Temperatura()
            {
                InitializeComponent();
                tbxValor1.Text = "0";
                //tbxRound.Text = "0";
                tbxValor2.Text = "0";
                cbxEntrada.SelectedIndex = 0;
                cbxSalida.SelectedIndex = 0;
            }
    
            // Botones esenciales
            private void btnClear_Click(object sender, EventArgs e)
            {
                tbxValor2.Text = "0";
                tbxValor1.Text = "0";
                //tbxRound.Text = "0";
                secuencia = true;
            }
    
            private void btnAtras_Click(object sender, EventArgs e)
            {
                tbxValor1.Text = tbxValor1.Text.Substring(0, tbxValor1.Text.Length - 1);
            }
    
            // Botones numericos
            bool secuencia = true;
            private void btn0_Click(object sender, EventArgs e)
            {
                if (tbxValor1.Text == "0")
                {
                    return;
                }
                else
                    tbxValor1.Text = tbxValor1.Text + "0";
            }
    
            private void btn1_Click(object sender, EventArgs e)
            {
                if (secuencia == true)
                {
                    tbxValor1.Text = "";
                    tbxValor1.Text = "1";
                    secuencia = false;
                }
                else
                {
                    tbxValor1.Text = tbxValor1.Text + "1";
                }
            }
    
            private void btn2_Click(object sender, EventArgs e)
            {
                if (secuencia == true)
                {
                    tbxValor1.Text = "";
                    tbxValor1.Text = "2";
                    secuencia = false;
                }
                else
                {
                    tbxValor1.Text = tbxValor1.Text + "2";
                }
            }
    
            private void btn3_Click(object sender, EventArgs e)
            {
                if (secuencia == true)
                {
                    tbxValor1.Text = "";
                    tbxValor1.Text = "3";
                    secuencia = false;
                }
                else
                {
                    tbxValor1.Text = tbxValor1.Text + "3";
                }
            }
    
            private void btn4_Click(object sender, EventArgs e)
            {
                if (secuencia == true)
                {
                    tbxValor1.Text = "";
                    tbxValor1.Text = "4";
                    secuencia = false;
                }
                else
                {
                    tbxValor1.Text = tbxValor1.Text + "4";
                }
            }
    
            private void btn5_Click(object sender, EventArgs e)
            {
                if (secuencia == true)
                {
                    tbxValor1.Text = "";
                    tbxValor1.Text = "5";
                    secuencia = false;
                }
                else
                {
                    tbxValor1.Text = tbxValor1.Text + "5";
                }
            }
    
            private void btn6_Click(object sender, EventArgs e)
            {
                if (secuencia == true)
                {
                    tbxValor1.Text = "";
                    tbxValor1.Text = "6";
                    secuencia = false;
                }
                else
                {
                    tbxValor1.Text = tbxValor1.Text + "6";
                }
            }
    
            private void btn7_Click(object sender, EventArgs e)
            {
                if (secuencia == true)
                {
                    tbxValor1.Text = "";
                    tbxValor1.Text = "7";
                    secuencia = false;
                }
                else
                {
                    tbxValor1.Text = tbxValor1.Text + "7";
                }
            }
    
            private void btn8_Click(object sender, EventArgs e)
            {
                if (secuencia == true)
                {
                    tbxValor1.Text = "";
                    tbxValor1.Text = "8";
                    secuencia = false;
                }
                else
                {
                    tbxValor1.Text = tbxValor1.Text + "8";
                }
            }
    
            private void btn9_Click(object sender, EventArgs e)
            {
                if (secuencia == true)
                {
                    tbxValor1.Text = "";
                    tbxValor1.Text = "9";
                    secuencia = false;
                }
                else
                {
                    tbxValor1.Text = tbxValor1.Text + "9";
                }
            }
            private void btnComa_Click(object sender, EventArgs e)
            {
                tbxValor1.Text = tbxValor1.Text + ",";
            }
    
            // Codigo para poder escribir en el textbox 1 sin tener que seleccionarlo.
            // NO, ERROR! Este código lo que hace es un click automático al botón del dígito pulsado
            private void Masa_KeyPress(object sender, KeyPressEventArgs e)
            {
                Button[] buttons = { btn0, btn1, btn2, btn3, btn4, btn5, btn6, btn7, btn8, btn9 };
    
                if (char.IsDigit(e.KeyChar))
                {
                    buttons[Convert.ToInt32(e.KeyChar.ToString())].PerformClick();
                }
            }
    
            // Codigo principal
            private double celsius;
            private void cbxSalida_SelectedIndexChanged(object sender, EventArgs e)
            {
                ConvertirTemperatura();
            }
    
            private void ConvertirTemperatura()
            {
                // Codigo de conversiones de unidades de Cesius a X unidad
                if (cbxEntrada.Text == "Celsius" && cbxSalida.Text == "Celsius")
                {
                    tbxValor2.Text = tbxValor1.Text;
                }
                else if (cbxEntrada.Text == "Celsius" && cbxSalida.Text == "Fahrenheit")
                {
                    celsius = (Convert.ToDouble(tbxValor1.Text) * 9) / 5 + 32;
                    tbxValor2.Text = celsius.ToString();
                }
                else if (cbxEntrada.Text == "Celsius" && cbxSalida.Text == "Kelvin")
                {
                    celsius = Convert.ToDouble(tbxValor1.Text) + 273.15;
                    tbxValor2.Text = celsius.ToString();
                }
                else if (cbxEntrada.Text == "Celsius" && cbxSalida.Text == "Rankine")
                {
                    celsius = (Convert.ToDouble(tbxValor1.Text) * 9) / 5 + 491.67;
                    tbxValor2.Text = celsius.ToString();
                }
                else if (cbxEntrada.Text == "Celsius" && cbxSalida.Text == "Réamur")
                {
                    celsius = (Convert.ToDouble(tbxValor1.Text) * 4) / 5;
                    tbxValor2.Text = celsius.ToString();
                }
                else if (cbxEntrada.Text == "Celsius" && cbxSalida.Text == "Newton")
                {
                    celsius = Convert.ToDouble(tbxValor1.Text) * 0.33000;
                    tbxValor2.Text = celsius.ToString();
                }
                else if (cbxEntrada.Text == "Celsius" && cbxSalida.Text == "Rømer")
                {
                    celsius = (Convert.ToDouble(tbxValor1.Text) / 1.904762) + 7.5;
                    tbxValor2.Text = celsius.ToString();
                }
                else if (cbxEntrada.Text == "Celsius" && cbxSalida.Text == "Delisle")
                {
                    celsius = (Convert.ToDouble(tbxValor1.Text) * 1.5000) - 100.00;
                    tbxValor2.Text = celsius.ToString();
                }
            }
    
            private void tbxValor1_TextChanged(object sender, EventArgs e)
            {
                if (tbxValor1.Text == "")
                    tbxValor1.Text = "0";
    
                ConvertirTemperatura();
            }
        }
    }

    Hay una forma de escribir un único controlador del Click para los botones con los dígitos, en lugar de 10, si te interesa decime.

    Saludos

    EDITO: 

    Recorda asociar el método de TextChanged al TextBox 1.

    lunes, 22 de junio de 2020 3:43
  • hola

    Piensas que definir un evento por cada boton btnXX_Click es correcto ?

    porque no pones el valor que representa cada boton en la propiedad Tag y despues asignas el mismo evento Click a todos los botones

    entonces quedaria mas simple y no repites siempre lo mismo

            private void btnXX_Click(object sender, EventArgs e)
            {
                string valor = ((Button)sender).Tag.ToString();
    
                if (secuencia)
                {
                    tbxValor1.Text = "";
                    tbxValor1.Text = valor;
                    secuencia = false;
                }
                else
                {
                    tbxValor1.Text = tbxValor1.Text + valor;
                }
            }


    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    lunes, 22 de junio de 2020 4:24
  • Wao, cuando veo como lo arreglas te me digo me falta mucho por aprender pero de todos modos muchas gracias voy a hacerlo como lo arreglaste, y claro me interesa saber como hacer que los botones estén en un unido controlador.
    lunes, 22 de junio de 2020 10:31
  • 😥 Es que soy novato, y hago esto para aprender y no cometer estos errores cuando ya sea más experimentado amigo, gracias por tu comentario entonces haré lo que hiciste. 👍
    lunes, 22 de junio de 2020 10:33
  • ¿Alguna novedad sobre la consulta realizada? ¿Han sido útiles las respuestas proporcionadas?  

     

    lunes, 22 de junio de 2020 15:53
    Moderador
  • Que si me han sido útiles?

    Claro que me han sido útiles, estos capos saben y me explicaron muy bien. 😁👍

    lunes, 22 de junio de 2020 16:30