Plnohodnotnou kalkulačku v C# pomocí Windows Forms s použitím architektury MVC (Model-View-Controller)

Článek detailně vysvětluje, jak vytvořit kalkulačku v jazyce C# pomocí Windows Forms a architektury MVC. Vysvětluje strukturu projektu rozdělenou na model, view a controller a uvádí ukázky kódu pro každou část. Čtenář se dozví, jak správně oddělit logiku výpočtů, ovládání vstupů a uživatelské rozhraní. Text také popisuje, jak nastavit jednoduché uživatelské prvky jako textová pole, combobox a tlačítko. Článek je ideální pro začátečníky, kteří si chtějí osvojit strukturované programování a MVC principy v praxi.
Celou aplikaci rozdělíme do tří vrstev:
- Model – Logika výpočtů.
- View – Uživatelské rozhraní (Windows Form).
- Controller – Ovládání vstupů uživatele a propojení View s Modelem.
📋 Struktura aplikace:
markdownZkopírovatUpravit/Model
KalkulackaModel.cs
/View
KalkulackaForm.cs
/Controller
KalkulackaController.cs
Program.cs
1. Model (KalkulackaModel.cs)
namespace KalkulackaApp.Model
{
public class KalkulackaModel
{
public double Scitej(double a, double b) => a + b;
public double Odecitej(double a, double b) => a - b;
public double Nasob(double a, double b) => a * b;
public double Deli(double a, double b)
{
if (b == 0)
throw new DivideByZeroException("Nelze dělit nulou.");
return a / b;
}
}
}
2. Controller (KalkulackaController.cs)
using KalkulackaApp.Model;
namespace KalkulackaApp.Controller
{
public class KalkulackaController
{
private readonly KalkulackaModel _model;
public KalkulackaController(KalkulackaModel model)
{
_model = model;
}
public double ProvedOperaci(double a, double b, string operace)
{
return operace switch
{
"+" => _model.Scitej(a, b),
"-" => _model.Odecitej(a, b),
"*" => _model.Nasob(a, b),
"/" => _model.Deli(a, b),
_ => throw new InvalidOperationException("Neplatná operace.")
};
}
}
}
3. View (KalkulackaForm.cs)
using KalkulackaApp.Controller;
using KalkulackaApp.Model;
using System;
using System.Windows.Forms;
namespace KalkulackaApp.View
{
public partial class KalkulackaForm : Form
{
private readonly KalkulackaController _controller;
public KalkulackaForm()
{
InitializeComponent();
_controller = new KalkulackaController(new KalkulackaModel());
}
private void btnVypocitat_Click(object sender, EventArgs e)
{
try
{
double cislo1 = double.Parse(txtCislo1.Text);
double cislo2 = double.Parse(txtCislo2.Text);
string operace = cmbOperace.SelectedItem.ToString();
double vysledek = _controller.ProvedOperaci(cislo1, cislo2, operace);
lblVysledek.Text = $"Výsledek: {vysledek}";
}
catch (Exception ex)
{
MessageBox.Show($"Chyba: {ex.Message}", "Chyba", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
}
}
Poznámky k UI prvkům, které musíš vytvořit na Formu:
- 2 TextBoxy:
txtCislo1
,txtCislo2
- ComboBox:
cmbOperace
(položky:+
,-
,*
,/
) - Button:
btnVypocitat
- Label:
lblVysledek
4. KalkulackaForm.Designer.cs (vzhled aplikace)
namespace KalkulackaApp.View
{
partial class KalkulackaForm
{
private System.ComponentModel.IContainer components = null;
private System.Windows.Forms.TextBox txtCislo1;
private System.Windows.Forms.TextBox txtCislo2;
private System.Windows.Forms.ComboBox cmbOperace;
private System.Windows.Forms.Button btnVypocitat;
private System.Windows.Forms.Label lblVysledek;
private System.Windows.Forms.Label lblCislo1;
private System.Windows.Forms.Label lblCislo2;
private System.Windows.Forms.Label lblOperace;
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
private void InitializeComponent()
{
this.txtCislo1 = new System.Windows.Forms.TextBox();
this.txtCislo2 = new System.Windows.Forms.TextBox();
this.cmbOperace = new System.Windows.Forms.ComboBox();
this.btnVypocitat = new System.Windows.Forms.Button();
this.lblVysledek = new System.Windows.Forms.Label();
this.lblCislo1 = new System.Windows.Forms.Label();
this.lblCislo2 = new System.Windows.Forms.Label();
this.lblOperace = new System.Windows.Forms.Label();
this.SuspendLayout();
//
// txtCislo1
//
this.txtCislo1.Location = new System.Drawing.Point(150, 30);
this.txtCislo1.Name = "txtCislo1";
this.txtCislo1.Size = new System.Drawing.Size(150, 23);
this.txtCislo1.TabIndex = 0;
//
// txtCislo2
//
this.txtCislo2.Location = new System.Drawing.Point(150, 70);
this.txtCislo2.Name = "txtCislo2";
this.txtCislo2.Size = new System.Drawing.Size(150, 23);
this.txtCislo2.TabIndex = 1;
//
// cmbOperace
//
this.cmbOperace.DropDownStyle = System.Windows.Forms.ComboBoxStyle.DropDownList;
this.cmbOperace.FormattingEnabled = true;
this.cmbOperace.Items.AddRange(new object[] { "+", "-", "*", "/" });
this.cmbOperace.Location = new System.Drawing.Point(150, 110);
this.cmbOperace.Name = "cmbOperace";
this.cmbOperace.Size = new System.Drawing.Size(150, 23);
this.cmbOperace.TabIndex = 2;
//
// btnVypocitat
//
this.btnVypocitat.Location = new System.Drawing.Point(150, 150);
this.btnVypocitat.Name = "btnVypocitat";
this.btnVypocitat.Size = new System.Drawing.Size(150, 30);
this.btnVypocitat.TabIndex = 3;
this.btnVypocitat.Text = "Vypočítat";
this.btnVypocitat.UseVisualStyleBackColor = true;
this.btnVypocitat.Click += new System.EventHandler(this.btnVypocitat_Click);
//
// lblVysledek
//
this.lblVysledek.AutoSize = true;
this.lblVysledek.Font = new System.Drawing.Font("Segoe UI", 10F, System.Drawing.FontStyle.Bold);
this.lblVysledek.Location = new System.Drawing.Point(150, 200);
this.lblVysledek.Name = "lblVysledek";
this.lblVysledek.Size = new System.Drawing.Size(78, 19);
this.lblVysledek.TabIndex = 4;
this.lblVysledek.Text = "Výsledek:";
//
// lblCislo1
//
this.lblCislo1.AutoSize = true;
this.lblCislo1.Location = new System.Drawing.Point(50, 30);
this.lblCislo1.Name = "lblCislo1";
this.lblCislo1.Size = new System.Drawing.Size(47, 15);
this.lblCislo1.TabIndex = 5;
this.lblCislo1.Text = "Číslo 1:";
//
// lblCislo2
//
this.lblCislo2.AutoSize = true;
this.lblCislo2.Location = new System.Drawing.Point(50, 70);
this.lblCislo2.Name = "lblCislo2";
this.lblCislo2.Size = new System.Drawing.Size(47, 15);
this.lblCislo2.TabIndex = 6;
this.lblCislo2.Text = "Číslo 2:";
//
// lblOperace
//
this.lblOperace.AutoSize = true;
this.lblOperace.Location = new System.Drawing.Point(50, 110);
this.lblOperace.Name = "lblOperace";
this.lblOperace.Size = new System.Drawing.Size(55, 15);
this.lblOperace.TabIndex = 7;
this.lblOperace.Text = "Operace:";
//
// KalkulackaForm
//
this.AutoScaleDimensions = new System.Drawing.SizeF(7F, 15F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(400, 270);
this.Controls.Add(this.lblOperace);
this.Controls.Add(this.lblCislo2);
this.Controls.Add(this.lblCislo1);
this.Controls.Add(this.lblVysledek);
this.Controls.Add(this.btnVypocitat);
this.Controls.Add(this.cmbOperace);
this.Controls.Add(this.txtCislo2);
this.Controls.Add(this.txtCislo1);
this.Name = "KalkulackaForm";
this.Text = "Kalkulačka - MVC Windows Forms";
this.ResumeLayout(false);
this.PerformLayout();
}
}
}
✍️ Co tento Designer.cs
obsahuje:
- TextBox pro číslo 1 (
txtCislo1
) - TextBox pro číslo 2 (
txtCislo2
) - ComboBox s volbou operací
+
,-
,*
,/
(cmbOperace
) - Button pro spuštění výpočtu (
btnVypocitat
) - Label pro zobrazení výsledku (
lblVysledek
) - Popisky (Labels) pro čísla a operaci (
lblCislo1
,lblCislo2
,lblOperace
)
✅ Stačí tento soubor uložit jako KalkulackaForm.Designer.cs
vedle KalkulackaForm.cs
a propojí se to automaticky!
✅ Ve Visual Studiu pak normálně uvidíš Form ve Windows Forms Designeru.
5. Program.cs (start aplikace)
using System;
using System.Windows.Forms;
using KalkulackaApp.View;
namespace KalkulackaApp
{
internal static class Program
{
[STAThread]
static void Main()
{
Application.SetHighDpiMode(HighDpiMode.SystemAware);
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new KalkulackaForm());
}
}
}
🔥 Funkce kalkulačky:
- Sčítání, odčítání, násobení, dělení (s ošetřením dělení nulou).
- MVC architektura.
- Čistý oddělený kód – snadná údržba a rozšiřitelnost (např. pro pokročilé operace v budoucnu).
