ARTICLE AD BOX
I started learning and practicing C# WinForms again after quite a long break, and I’m rebuilding my basics with smaller practice projects before moving on to larger applications.
This project is a simple number analyzer application. The main goal was to practice core WinForms concepts again, such as working with toolbox controls, event handling, List collections, updating UI elements dynamically, and implementing basic desktop application logic.
The application allows the user to:
add numbers using a NumericUpDown control
display them inside a ListBox
calculate count, sum, average, minimum, maximum
calculate even/odd, positive/negative, and zero counts
sort numbers in ascending/descending order
delete selected numbers
clear the list
handle menu actions
I used several common WinForms elements and concepts in this project, including:
NumericUpDown
ListBox
Labels
Buttons
GroupBoxes
MenuStrip
MessageBox validation
List collections
loops and conditional logic
some LINQ methods
I’ll upload the full project files together with screenshots of the application.
I would mainly like feedback regarding:
whether my overall structure is reasonable for a beginner/intermediate WinForms practice project
whether storing data in multiple List<decimal> collections is a good approach here
whether manually refreshing the ListBox is acceptable in smaller WinForms projects
possible improvements regarding naming, validation, separation of logic, and cleaner WinForms practices
I’m not looking for someone to rewrite the project for me — I mainly want to understand what habits or structural decisions I should improve early while relearning WinForms.
Form1.cs:
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Runtime.InteropServices; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace Numbers { public partial class Form1 : Form { List<decimal> numbers = new List<decimal>(); List<decimal> even = new List<decimal>(); List<decimal> odd = new List<decimal>(); List<decimal> Null = new List<decimal>(); public Form1() { InitializeComponent(); numericUpDown1.Minimum = -1000000; numericUpDown1.Maximum = 1000000; } private void button1_Click(object sender, EventArgs e) { decimal number = numericUpDown1.Value; numbers.Add(number); if (number % 2 == 0 && number!= 0) { even.Add(number); } if (number % 2 == 1 || number%2 == -1 && number != 0) { odd.Add(number); } else { Null.Add(number); } listBox1.Items.Clear(); foreach (decimal n in numbers) { listBox1.Items.Add(n); } } private void button3_Click(object sender, EventArgs e) { int pt = 0; int nt = 0; int null_ = 0; Count.Text = Convert.ToString(numbers.Count); Sum.Text = Convert.ToString(numbers.Sum()); Avarage.Text = (numbers.Sum() / numbers.Count()).ToString("F2"); Minimum.Text = Convert.ToString(numbers.Min()); Maximum.Text = Convert.ToString(numbers.Max()); Even.Text = Convert.ToString(even.Count()); Odd.Text = Convert.ToString(odd.Count()); foreach (decimal item in numbers) { if (item > 0) { pt++; } if (item < 0) { nt++; } if (item == 0) { null_++; } } Positive.Text = Convert.ToString(pt); Negative.Text = Convert.ToString(nt); Nulls.Text = Convert.ToString(null_); } private void listBox1_SelectedIndexChanged(object sender, EventArgs e) { if (listBox1.SelectedItem != null) { label3.Text = "Selected number: " + listBox1.SelectedItem.ToString(); } } private void sToolStripMenuItem_Click(object sender, EventArgs e) { if (numbers.Count != 0) { numbers.Clear(); even.Clear(); odd.Clear(); Null.Clear(); } } private void quitToolStripMenuItem_Click(object sender, EventArgs e) { DialogResult answer = MessageBox.Show( "Are you sure, you wanna leave?", "Exit", MessageBoxButtons.YesNo ); if (answer == DialogResult.Yes) { Application.Exit(); } } private void addNumberToolStripMenuItem_Click(object sender, EventArgs e) { numericUpDown1.Focus(); } private void deleteSelectedToolStripMenuItem_Click(object sender, EventArgs e) { button2.Focus(); } private void analysisToolStripMenuItem_Click(object sender, EventArgs e) { button3.Focus(); } private void button2_Click(object sender, EventArgs e) { if (listBox1.SelectedItem == null ) { MessageBox.Show("There is no selected row!"); return; } listBox1.Items.Remove(listBox1.SelectedItem); } private void button4_Click(object sender, EventArgs e) { numbers.Sort(); listBox1.Items.Clear(); foreach (decimal n in numbers) { listBox1.Items.Add(n); } } private void button5_Click(object sender, EventArgs e) { numbers.Sort(); numbers.Reverse(); listBox1.Items.Clear(); foreach (decimal n in numbers) { listBox1.Items.Add(n); } } private void increasToolStripMenuItem_Click(object sender, EventArgs e) { button4.Focus(); } private void decreaseToolStripMenuItem_Click(object sender, EventArgs e) { button5.Focus(); } } }


