c# – Design of a display in Windows Forms

Question:

I am using C# and windows forms to be able to represent a display on the screen, what I want to do is:

I have 7 labels , which are going to act as a display and 11 buttons (0, 1, 2, 3,….., 9, Off) that when I press one of these buttons, the corresponding number must appear on the display , for example, if I press 0, I have to get 0 on the display and so on up to nine and in the last case, which is Off, nothing will be shown.

I have two other buttons but it has nothing to do with this.

All this that I have mentioned works fine for me, but now another thing that I want to implement in the program is that when I press the keyboard key, for example, '1' or any other number, it reads it to me and shows it on the screen (I mean the display). ), but I don't get the latter.

this is my code

namespace Casa
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            label1.Visible = true;
            label2.Visible = true;
            label3.Visible = false;
            label4.Visible = true;
            label5.Visible = true;
            label6.Visible = true;
            label7.Visible = true;
        }

        private void button2_Click(object sender, EventArgs e)
        {
            label1.Visible = false;
            label2.Visible = false;
            label3.Visible = false;
            label4.Visible = true;
            label5.Visible = false;
            label6.Visible = true;
            label7.Visible = false;
        }

        private void button3_Click(object sender, EventArgs e)
        {
            label1.Visible = true;
            label2.Visible = false;
            label3.Visible = true;
            label4.Visible = true;
            label5.Visible = true;
            label6.Visible = false;
            label7.Visible = true;
        }

        private void button4_Click(object sender, EventArgs e)
        {
            label1.Visible = true;
            label2.Visible = false;
            label3.Visible = true;
            label4.Visible = true;
            label5.Visible = false;
            label6.Visible = true;
            label7.Visible = true;
        }

        private void button5_Click(object sender, EventArgs e)
        {
            label1.Visible = false;
            label2.Visible = true;
            label3.Visible = true;
            label4.Visible = true;
            label5.Visible = false;
            label6.Visible = true;
            label7.Visible = false;
        }

        private void button6_Click(object sender, EventArgs e)
        {
            label1.Visible = true;
            label2.Visible = true;
            label3.Visible = true;
            label4.Visible = false;
            label5.Visible = false;
            label6.Visible = true;
            label7.Visible = true;
        }

        private void button7_Click(object sender, EventArgs e)
        {
            label1.Visible = true;
            label2.Visible = true;
            label3.Visible = true;
            label4.Visible = false;
            label5.Visible = true;
            label6.Visible = true;
            label7.Visible = true;
        }

        private void button8_Click(object sender, EventArgs e)
        {
            label1.Visible = true;
            label2.Visible = false;
            label3.Visible = false;
            label4.Visible = true;
            label5.Visible = false;
            label6.Visible = true;
            label7.Visible = false;
        }

        private void button9_Click(object sender, EventArgs e)
        {
            label1.Visible = true;
            label2.Visible = true;
            label3.Visible = true;
            label4.Visible = true;
            label5.Visible = true;
            label6.Visible = true;
            label7.Visible = true;
        }

        private void button10_Click(object sender, EventArgs e)
        {
            label1.Visible = true;
            label2.Visible = true;
            label3.Visible = true;
            label4.Visible = true;
            label5.Visible = false;
            label6.Visible = true;
            label7.Visible = true;
        }

        private void button11_Click(object sender, EventArgs e)
        {
            label1.Visible = false;
            label2.Visible = false;
            label3.Visible = false;
            label4.Visible = false;
            label5.Visible = false;
            label6.Visible = false;
            label7.Visible = false;
        }

        private void button12_Click(object sender, EventArgs e)
        {
            timer1.Enabled = true;
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            label1.Visible = true;
            label2.Visible = true;
            label3.Visible = false;
            label4.Visible = true;
            label5.Visible = true;
            label6.Visible = true;
            label7.Visible = true;
            timer1.Interval = 1000;
            timer1.Enabled = false;
            timer2.Enabled = true;
        }

        private void timer2_Tick(object sender, EventArgs e)
        {
            label1.Visible = false;
            label2.Visible = false;
            label3.Visible = false;
            label4.Visible = true;
            label5.Visible = false;
            label6.Visible = true;
            label7.Visible = false;
            timer2.Interval = 1000;
            timer2.Enabled = false;
            timer3.Enabled = true;
        }

        private void timer3_Tick(object sender, EventArgs e)
        {
            label1.Visible = true;
            label2.Visible = false;
            label3.Visible = true;
            label4.Visible = true;
            label5.Visible = true;
            label6.Visible = false;
            label7.Visible = true;
            timer3.Interval = 1000;
            timer3.Enabled = false;
            timer4.Enabled = true;
        }

        private void timer4_Tick(object sender, EventArgs e)
        {
            label1.Visible = true;
            label2.Visible = false;
            label3.Visible = true;
            label4.Visible = true;
            label5.Visible = false;
            label6.Visible = true;
            label7.Visible = true;
            timer4.Interval = 1000;
            timer4.Enabled = false;
            timer5.Enabled = true;
        }

        private void timer5_Tick(object sender, EventArgs e)
        {
            label1.Visible = false;
            label2.Visible = true;
            label3.Visible = true;
            label4.Visible = true;
            label5.Visible = false;
            label6.Visible = true;
            label7.Visible = false;
            timer5.Interval = 1000;
            timer5.Enabled = false;
            timer6.Enabled = true;
        }

        private void timer6_Tick(object sender, EventArgs e)
        {
            label1.Visible = true;
            label2.Visible = true;
            label3.Visible = true;
            label4.Visible = false;
            label5.Visible = false;
            label6.Visible = true;
            label7.Visible = true;
            timer6.Interval = 1000;
            timer6.Enabled = false;
            timer7.Enabled = true;
        }

        private void timer7_Tick(object sender, EventArgs e)
        {
            label1.Visible = true;
            label2.Visible = true;
            label3.Visible = true;
            label4.Visible = false;
            label5.Visible = true;
            label6.Visible = true;
            label7.Visible = true;
            timer7.Interval = 1000;
            timer7.Enabled = false;
            timer8.Enabled = true;
        }

        private void timer8_Tick(object sender, EventArgs e)
        {
            label1.Visible = true;
            label2.Visible = false;
            label3.Visible = false;
            label4.Visible = true;
            label5.Visible = false;
            label6.Visible = true;
            label7.Visible = false;
            timer8.Interval = 1000;
            timer8.Enabled = false;
            timer9.Enabled = true;
        }

        private void timer9_Tick(object sender, EventArgs e)
        {
            label1.Visible = true;
            label2.Visible = true;
            label3.Visible = true;
            label4.Visible = true;
            label5.Visible = true;
            label6.Visible = true;
            label7.Visible = true;
            timer9.Interval = 1000;
            timer9.Enabled = false;
            timer10.Enabled = true;
        }

        private void timer10_Tick(object sender, EventArgs e)
        {
            label1.Visible = true;
            label2.Visible = true;
            label3.Visible = true;
            label4.Visible = true;
            label5.Visible = false;
            label6.Visible = true;
            label7.Visible = true;
            timer10.Interval = 1000;
            timer10.Enabled = false;
        }

        private void button13_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        /// Estos dos métodos de abajo son de prueba de lo que quiero probar, que al pulsar la 
        /// tecla, el '0' por ejemplo me salga en el display representado, tendría que tener los mismos
        /// valores que el del botón: button1_Click.
        private void Form1_KeyDown(object sender, KeyEventArgs e)
        {
            label1.Visible = false;
            label2.Visible = false;
            label3.Visible = false;
            label4.Visible = true;
            label5.Visible = false;
            label6.Visible = true;
            label7.Visible = false;
        }

        private void Form1_KeyPress(object sender, KeyPressEventArgs e)
        {
            if(e.KeyChar=='a')
            {
                label1.Visible = true;
                label2.Visible = true;
                label3.Visible = false;
                label4.Visible = true;
                label5.Visible = true;
                label6.Visible = true;
                label7.Visible = true;
            }
        }
    }
}

Answer:

By default, when you press a key, the keyboard event of the control that has the focus is generated. The one on the form only jumps if there is no active control.

To capture keyboard events at the form level you must set the KeyPreview property to true.

Also, as you are doing it, you repeat a lot of code, and more than you will have to repeat to do the keyboard input. I would recommend you to refactor the code to have a single method that shows the characters on the display.

You could have the different displays in a Dictionary in which the key is the character to show and the value is the segments of the display to activate.

You could also define the character to display for each button in the Tag property so that you could use a single click event handler for all buttons.

Take a look at this example:

public partial class Form1 : Form
{

    private readonly Dictionary<string, Display> _displays;

    public Form1()
    {
        InitializeComponent();
        _displays = new Dictionary<string, Display>();
        _displays.Add("off", new Display());
        _displays.Add("0",
            new Display { Top = true, TopLeft = true, TopRight = true, BottomLeft = true, BottomRight = true, Bottom = true });
        _displays.Add("1", new Display {TopRight = true, BottomRight = true});
        _displays.Add("2",
            new Display() {Top = true, TopRight = true, Middle = true, BottomLeft = true, Bottom = true});
        _displays.Add("3",
            new Display {Top = true, TopRight = true, Middle = true, BottomRight = true, Bottom = true});
        _displays.Add("4", new Display {TopLeft = true, TopRight = true, Middle = true, BottomRight = true});
        _displays.Add("5",
            new Display {Top = true, TopLeft = true, Middle = true, BottomRight = true, Bottom = true});
        _displays.Add("6",
            new Display { Top = true, TopLeft = true, Middle = true, BottomLeft = true, BottomRight = true, Bottom = true});
        _displays.Add("7", 
            new Display { Top = true, TopRight = true, BottomRight = true});
        _displays.Add("8", 
            new Display { Top=true, TopLeft = true, TopRight = true, Middle = true, BottomLeft = true, BottomRight = true, Bottom = true});
        _displays.Add("9",
            new Display { Top = true, TopLeft = true, TopRight = true, Middle = true, BottomRight = true, Bottom = true});
        Button[] buttons =
        {
            button1, button2, button3, button4, button5, button6, button7, button8, button9,
            button10, button11
        };
        for (var i = 0; i < buttons.Length; i++)
        {
            buttons[i].Tag = i < 10 ? i.ToString() : "off";
            buttons[i].Click += Button_Click;
        }
        KeyPreview = true;
        KeyPress += Form_KeyPress;
    }

    private void Form_KeyPress(object sender, KeyPressEventArgs e)
    {
        Show(e.KeyChar.ToString());
    }

    private void Button_Click(object sender, EventArgs e)
    {
        Show((string)((Control)sender).Tag);
    }

    private void Show(string key)
    {
        if (!_displays.ContainsKey(key)) return;

        Display display = _displays[key];
        label1.Visible = display.Top;
        label2.Visible = display.TopLeft;
        label3.Visible = display.Middle;
        label4.Visible = display.TopRight;
        label5.Visible = display.BottomLeft;
        label6.Visible = display.BottomRight;
        label7.Visible = display.Bottom;
    }

}

internal class Display
{
    public bool Top;
    public bool TopLeft;
    public bool TopRight;
    public bool Middle;
    public bool BottomLeft;
    public bool BottomRight;
    public bool Bottom;
}
Scroll to Top