Przejrzyj samouczeki dostępne pod adresem
Przykład notatnika w C# oraz wyświetlania danych:
W Windows Forms (WinForms), tworzenie nowych okien polega na tworzeniu instancja klasy dziedziczącej po System.Windows.Forms.Form.
Dodanie nowego okna ExampleForm.cs:
public partial class ExampleForm : Form // dziedziczenie po Form
{
public ExampleForm() // Konstruktor klasy
{
InitializeComponent(); // Tworzy instancje kontrolek (np. Button, TextBox, Label). Ustawia ich właściwości (np. pozycję, tekst, kolory). Dodaje je do formularza (this.Controls.Add(...)). Podpina zdarzenia (np. button1.Click += ...).
}
}
Aby otworzyć nowe okno należy utworzyć instancję ExampleForm a na utworzonym obiekcie wywołać metodę Show() lub ShowDialog(). Metody różnią się tym że druga metoda zablokuje dostęp do innych okienek dopóki nie zostanie ono zamknięte.
internal static class Program {
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main() {
ApplicationConfiguration.Initialize(); //Włączenie DPI awareness (lepsze skalowanie na ekranach 4K). Ustawienie domyślnej czcionki(np.Segoe UI zamiast klasycznej). Włączenie wizualnych stylów.
var subForm = new ExampleForm();
subForm.Show();// nieblokująco
Application.Run(new ExampleForm()); //Rozpoczyna główną pętlę aplikacji Windows Forms – czyli tzw. "message loop", która: Obsługuje kliknięcia, klawiaturę, rysowanie, zdarzenia itp. Utrzymuje aplikację przy życiu, dopóki główne okno nie zostanie zamknięte. Bez niej okno od razu znika i program kończy działanie.
}
}

| Klasa / Właściwość / Zdarzenie | Dotyczy | Opis |
|---|---|---|
MenuStrip |
Klasa | Główna klasa do tworzenia menu. |
ToolStripMenuItem |
Klasa | Element menu, może mieć podmenu. |
ContextMenuStrip |
Klasa | Menu kontekstowe (prawy przycisk myszy). |
ToolStripSeparator |
Klasa | Separator (linia) między elementami menu. |
Items |
Menu, Kontekst | Kolekcja elementów menu (ToolStripMenuItem). |
Location |
MenuStrip |
Pozycja menu na formularzu. |
Dock |
MenuStrip |
Przyczepienie do krawędzi formularza (zwykle Top). |
Name |
Wszystkie | Nazwa kontrolki. |
Text |
ToolStripMenuItem |
Tekst widoczny na elemencie menu. |
DropDownItems |
ToolStripMenuItem |
Podmenu – kolejne ToolStripMenuItem. |
ShortcutKeys |
ToolStripMenuItem |
Skrót klawiszowy (np. Ctrl+S). |
CheckOnClick |
ToolStripMenuItem |
Pozwala zaznaczać/odznaczać po kliknięciu. |
Checked |
ToolStripMenuItem |
Czy zaznaczone (jeśli opcja wyboru). |
Enabled |
ToolStripMenuItem |
Czy opcja menu jest aktywna. |
Image |
ToolStripMenuItem |
Obrazek (ikona) przy elemencie menu. |
SourceControl |
ContextMenuStrip |
Kontrolka, do której menu kontekstowe jest przypięte. |
Click |
ToolStripMenuItem |
Wykonywane po kliknięciu w opcję menu. |
DropDownOpening |
ToolStripMenuItem |
Zdarzenie przed rozwinięciem podmenu. |
DropDownClosed |
ToolStripMenuItem |
Zdarzenie po zamknięciu podmenu. |
Opening |
ContextMenuStrip |
Zdarzenie przed otwarciem menu kontekstowego. |
Closed |
ContextMenuStrip |
Zdarzenie po zamknięciu menu kontekstowego. |

<Nazwa>.Designer.cs dodaj kod inicjalizujący menu i jego opcje w metodzie InitializeComponent().Designer.cs</summary>
To część klasy formularza, która odpowiada tylko za wygląd – layout, kontrolki, ustawienia. Zazwyczaj nie zawiera logiki – Visual Studio uzupełnia/aktualizuje plik automatycznie, gdy przeciągasz elementy na formularz w trybie projektowania.
</details>
// Inicjalizacja instancji głównego paska menu (MenuStrip)
this.menuStrip1 = new System.Windows.Forms.MenuStrip();
// Inicjalizacja głównego elementu menu "Plik"
this.fileMenuItem = new System.Windows.Forms.ToolStripMenuItem();
// Inicjalizacja pozycji w menu "Plik"
this.newMenuItem = new System.Windows.Forms.ToolStripMenuItem(); // Opcja "Nowy"
this.openMenuItem = new System.Windows.Forms.ToolStripMenuItem(); // Opcja "Otwórz"
this.exitMenuItem = new System.Windows.Forms.ToolStripMenuItem(); // Opcja "Zamknij / Wyjście"
// Dodanie głównej pozycji menu "Plik" do menuStrip
this.menuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.fileMenuItem
});
// Ustawienia pozycji menuStrip w oknie formularza
this.menuStrip1.Location = new System.Drawing.Point(0, 0); // Góra formularza
this.menuStrip1.Name = "menuStrip1"; // Unikalna nazwa kontrolki
this.menuStrip1.Size = new System.Drawing.Size(800, 24); // Szerokość: 800px, Wysokość: 24px
this.menuStrip1.TabIndex = 0; // Indeks tabulacji
this.menuStrip1.Text = "menuStrip1"; // Tekst domyślny (rzadko widoczny)
// Dodanie podmenu (elementów podrzędnych) do "Plik"
this.fileMenuItem.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.newMenuItem,
this.openMenuItem,
this.exitMenuItem
});
this.fileMenuItem.Name = "fileMenuItem"; // Unikalna nazwa pozycji menu
this.fileMenuItem.Text = "Plik"; // Tekst widoczny w pasku menu
// Ustawienie pozycji podmenu: "Nowy"
this.newMenuItem.Name = "newMenuItem"; // Unikalna nazwa
this.newMenuItem.Text = "Nowy"; // Wyświetlany tekst
this.newMenuItem.Click += new System.EventHandler(this.NewMenuItem_Click); // Obsługa kliknięcia
// Ustawienie pozycji podmenu: "Otwórz"
this.openMenuItem.Name = "openMenuItem";
this.openMenuItem.Text = "Otwórz";
this.openMenuItem.Click += new System.EventHandler(this.OpenMenuItem_Click);
// Ustawienie pozycji podmenu: "Zamknij"
this.exitMenuItem.Name = "exitMenuItem";
this.exitMenuItem.Text = "Zamknij";
this.exitMenuItem.Click += new System.EventHandler(this.ExitMenuItem_Click);
// Ustawienie menuStrip jako głównego menu formularza
this.MainMenuStrip = this.menuStrip1;
// Dodanie menuStrip do listy kontrolek formularza (czyli faktyczne wyświetlenie go)
this.Controls.Add(this.menuStrip1);
<Nazwa>.csprivate void NewMenuItem_Click(object sender, EventArgs e)
{
MessageBox.Show("Nowy plik");
}
private void OpenMenuItem_Click(object sender, EventArgs e)
{
MessageBox.Show("Otwórz plik");
}
private void ExitMenuItem_Click(object sender, EventArgs e)
{
this.Close();
}

| Klasa / Właściwość / Zdarzenie | Dotyczy | Opis |
|---|---|---|
ToolStrip |
Klasa | Pasek narzędzi zawierający przyciski, tekst, rozwijane menu itd. |
ToolStripButton |
Klasa | Przycisk na pasku narzędziowym (może mieć ikonę i tekst). |
ToolStripLabel |
Klasa | Tekstowy element (np. etykieta). |
ToolStripSeparator |
Klasa | Separator (linia pionowa). |
ToolStripTextBox |
Klasa | Pole tekstowe umieszczone na pasku narzędzi. |
ToolStripComboBox |
Klasa | Rozwijana lista na pasku narzędzi. |
Items |
ToolStrip |
Kolekcja elementów paska narzędziowego. |
Dock |
ToolStrip |
Gdzie ma być zadokowany (np. Top). |
Name |
Wszystkie | Nazwa kontrolki. |
Text |
ToolStripButton, Label |
Tekst wyświetlany. |
Image |
ToolStripButton |
Ikona przy przycisku. |
DisplayStyle |
ToolStripButton |
Czy wyświetla tylko tekst, tylko ikonę, czy oba (TextAndImage). |
Click |
ToolStripButton |
Zdarzenie wykonywane po kliknięciu w przycisk. |
InitializeComponent w pliku z rozszerzeniem .Designer.cs. this.toolStrip1 = new System.Windows.Forms.ToolStrip();
this.btnNowy = new System.Windows.Forms.ToolStripButton();
this.btnZapisz = new System.Windows.Forms.ToolStripButton();
this.separator = new System.Windows.Forms.ToolStripSeparator();
this.btnPomoc = new System.Windows.Forms.ToolStripButton();
// toolStrip1 – pasek narzędziowy
this.toolStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {
this.btnNowy,
this.btnZapisz,
this.separator,
this.btnPomoc
});
this.toolStrip1.Location = new System.Drawing.Point(0, 24); // Tuż pod MenuStrip (jeśli masz)
this.toolStrip1.Name = "toolStrip1";
this.toolStrip1.Size = new System.Drawing.Size(800, 25);
this.toolStrip1.TabIndex = 1;
this.toolStrip1.Text = "toolStrip1";
// btnNowy – przycisk "Nowy"
this.btnNowy.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text;
this.btnNowy.Name = "btnNowy";
this.btnNowy.Size = new System.Drawing.Size(44, 22);
this.btnNowy.Text = "Nowy";
this.btnNowy.Click += new System.EventHandler(this.btnNowy_Click);
// btnZapisz – przycisk "Zapisz"
this.btnZapisz.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text;
this.btnZapisz.Name = "btnZapisz";
this.btnZapisz.Size = new System.Drawing.Size(45, 22);
this.btnZapisz.Text = "Zapisz";
this.btnZapisz.Click += new System.EventHandler(this.btnZapisz_Click);
// separator – separator między przyciskami
this.separator.Name = "separator";
this.separator.Size = new System.Drawing.Size(6, 25);
// btnPomoc – przycisk "Pomoc"
this.btnPomoc.DisplayStyle = System.Windows.Forms.ToolStripItemDisplayStyle.Text;
this.btnPomoc.Name = "btnPomoc";
this.btnPomoc.Size = new System.Drawing.Size(52, 22);
this.btnPomoc.Text = "Pomoc";
this.btnPomoc.Click += new System.EventHandler(this.btnPomoc_Click);
// Dodanie toolStripa do formularza
this.Controls.Add(this.toolStrip1);
.cs.private void btnNowy_Click(object sender, EventArgs e)
{
MessageBox.Show("Nowy dokument utworzony.");
}
private void btnZapisz_Click(object sender, EventArgs e)
{
MessageBox.Show("Dokument zapisany.");
}
private void btnPomoc_Click(object sender, EventArgs e)
{
MessageBox.Show("To jest pasek narzędziowy ToolStrip.", "Pomoc");
}
| Klasa | Właściwość | Opis |
|---|---|---|
DataGridView |
DataSource |
Ustawia źródło danych dla DataGridView (np. lista, tabela, BindingList). |
Columns |
Kolekcja kolumn w DataGridView. |
|
RowCount |
Liczba wierszy w DataGridView. |
|
ColumnCount |
Liczba kolumn w DataGridView. |
|
AllowUserToAddRows |
Określa, czy użytkownik może dodawać nowe wiersze. | |
AllowUserToDeleteRows |
Określa, czy użytkownik może usuwać wiersze. | |
ReadOnly |
Określa, czy cała tabela jest tylko do odczytu. | |
AutoGenerateColumns |
Określa, czy kolumny mają być automatycznie generowane na podstawie danych. | |
SelectionMode |
Określa sposób zaznaczania wierszy (np. pełne wiersze, pojedyncze komórki). | |
MultiSelect |
Określa, czy użytkownik może zaznaczać więcej niż jeden wiersz. | |
AllowUserToOrderColumns |
Określa, czy użytkownik może zmieniać kolejność kolumn. | |
AutoSizeColumnsMode |
Ustawia tryb automatycznego dostosowania szerokości kolumn. | |
DataGridViewColumn |
Name |
Nazwa kolumny. |
HeaderText |
Tekst wyświetlany w nagłówku kolumny. | |
DataPropertyName |
Określa nazwę właściwości powiązanej z tą kolumną. | |
Width |
Szerokość kolumny. | |
DefaultCellStyle |
Ustawienia stylu dla komórek w kolumnie. | |
ReadOnly |
Określa, czy kolumna jest tylko do odczytu. | |
Visible |
Określa, czy kolumna jest widoczna. | |
DataGridViewTextBoxColumn |
MaxInputLength |
Określa maksymalną liczbę znaków wprowadzanych w komórce. |
DataGridViewComboBoxColumn |
DataSource |
Źródło danych dla kolumny z listą rozwijaną. |
DisplayMember |
Określa nazwę właściwości, która będzie wyświetlana w ComboBox. |
|
ValueMember |
Określa nazwę właściwości, która będzie używana jako wartość w ComboBox. |
|
DataGridViewCheckBoxColumn |
TrueValue |
Określa wartość, która będzie traktowana jako “true” w polu wyboru. |
FalseValue |
Określa wartość, która będzie traktowana jako “false” w polu wyboru. | |
DataGridViewCellStyle |
Font |
Określa czcionkę używaną w komórkach. |
BackColor |
Kolor tła komórek. | |
ForeColor |
Kolor tekstu w komórkach. | |
Alignment |
Określa wyrównanie tekstu w komórkach. | |
Format |
Formatowanie tekstu, np. daty lub liczby (np. "dd/MM/yyyy"). |
|
WrapMode |
Określa, czy tekst w komórkach ma być zawijany. | |
DataGridViewRow |
Cells |
Kolekcja komórek w danym wierszu. |
IsNewRow |
Określa, czy wiersz jest nowym, dodanym przez użytkownika. | |
BindingList<T> |
ListChanged |
Zdarzenie wywoływane, gdy lista ulega zmianie. |
BindingSource |
DataSource |
Źródło danych, do którego jest podłączony BindingSource. |
Current |
Aktualny obiekt w BindingSource (można go edytować). |
|
Add |
Dodaje nowy obiekt do źródła danych. | |
Remove |
Usuwa obiekt z źródła danych. | |
MoveNext |
Przechodzi do następnego obiektu w kolekcji. | |
MovePrevious |
Przechodzi do poprzedniego obiektu w kolekcji. |
Stwórz aplikację do zarządzania listą kontaktów, w której użytkownik może dodać, edytować i usuwać kontakty. Każdy kontakt ma zawierać imię, nazwisko, numer telefonu i adres e-mail.
- DataGridView do wyświetlania listy kontaktów, edycji, usuwania oraz dodawania kontaktów.
- Stwórz klasę Kontakt z odpowiednimi właściwościami (Imię, Nazwisko, Telefon, Email).
- Przypisz dane z listy kontaktów do DataGridView.
Na początek utwórz nowy projekt aplikacji typu Windows Forms App w środowisku Visual Studio. Nazwij go np. KsiazkaKontaktowa lub inną nazwą, która jasno wskazuje na tematykę aplikacji. Następnie, w folderze projektu, dodaj nową klasę o nazwie Kontakt.cs. Klasa ta będzie służyć do przechowywania podstawowych danych każdej osoby w książce kontaktowej. Zdefiniuj w niej następujące właściwości publiczne:
- Imie – typu string, przechowujące imię kontaktu,
- Nazwisko – typu string, przechowujące nazwisko kontaktu,
- Telefon – typu string, przechowujące numer telefonu,
- Email – typu string, przechowujące adres e-mail. Zadbaj o to, aby plik z klasą znajdował się w katalogu głównym projektu lub w specjalnym folderze np. Models
Stwórz interfejs aplikacji z górnym menu głównym, które umożliwi użytkownikowi importowanie oraz eksportowanie kontaktów z/do pliku. Na głównym formularzu (Form1) dodaj komponent MenuStrip, który znajdziesz w zakładce „Toolbox” → „Menus & Toolbars”. Umieść go na górze formularza i dodaj do niego menu „Plik”, a w nim następujące opcje:
- Importuj kontakty – ta opcja powinna w przyszłości umożliwiać wczytanie listy kontaktów z pliku (np. .json lub .csv).
- Eksportuj kontakty – ta opcja będzie pozwalać na zapis aktualnej listy kontaktów do pliku.
- Na tym etapie nie musisz jeszcze implementować logiki zapisu i odczytu danych — wystarczy, że dodasz same elementy menu oraz podłączysz do nich puste zdarzenia kliknięcia.
Rozszerz interfejs aplikacji o pasek narzędzi (ToolStrip), który umożliwi szybki dostęp do najczęściej używanych funkcji oraz wyszukiwanie kontaktów. Na głównym formularzu dodaj komponent ToolStrip, dostępny w zakładce „Toolbox” → „Menus & Toolbars”. Umieść go bezpośrednio pod menu głównym (MenuStrip), tak aby wyglądał jak typowy pasek narzędzi. Dodaj do paska następujące elementy:
- Przycisk „Dodaj” – do dodawania nowego kontaktu.
- Przycisk „Edytuj” – do edytowania zaznaczonego kontaktu.
- Przycisk „Usuń” – do usuwania zaznaczonego kontaktu.
- Separator – oddziel przyciski od pola wyszukiwania.
- Pole tekstowe (ToolStripTextBox) – umożliwia wpisanie tekstu do wyszukania (np. imienia lub nazwiska).
- Przycisk „Szukaj” – po kliknięciu przeszukuje listę kontaktów na podstawie wpisanego tekstu.
Dodaj do formularza komponent DataGridView, który posłuży do wyświetlania listy kontaktów. Dane będą pobierane dynamicznie z listy obiektów klasy Kontakt, a kolumny powinny zostać wygenerowane automatycznie na podstawie właściwości klasy. Dodaj kontrolkę DataGridView. W Toolboxie znajdziesz ją w sekcji „Data”. Przeciągnij ją na formularz i rozmieść pod paskiem narzędzi (ToolStrip) tak, by zajmowała większość dostępnej przestrzeni. Ustaw właściwość Name na dataGridViewKontakty. Skonfiguruj automatyczne generowanie kolumn:
- Upewnij się, że właściwość AutoGenerateColumns jest ustawiona na true (domyślnie tak jest). Dzięki temu DataGridView sam utworzy kolumny odpowiadające właściwościom obiektów klasy Kontakt: Imie, Nazwisko, Telefon, Email. Przygotuj źródło danych – listę kontaktów W kodzie formularza (Form1.cs) utwórz listę kontaktów jako pole klasy:
private BindingList<Kontakt> listaKontaktow = new BindingList<Kontakt>();W konstruktorze formularza powiąż listę kontaktów z DataGridView (np. dataGridViewKontakty.DataSource) Teraz, gdy dodasz obiekt Kontakt do listaKontaktow, automatycznie pojawi się w DataGridView.
Zaimplementuj logikę pozwalającą na dodawanie nowych kontaktów, edycję istniejących oraz usuwanie wybranych kontaktów z listy. Wszystkie operacje będą dotyczyć danych powiązanych z DataGridView. W tym kroku utwórz oddzielny formularz, który będzie wykorzystywany zarówno do dodawania nowych kontaktów, jak i edytowania istniejących. Dzięki temu użytkownik będzie miał przejrzysty sposób na wprowadzanie danych. Obsłuż kliknięcie przycisku „Dodaj” z ToolStrip.Po kliknięciu otwórz nowy formularz (np. KontaktForm) z polami tekstowymi: Imie, Nazwisko, Telefon, Email. Po zatwierdzeniu (np. kliknięciu przycisku „Zapisz”), utwórz nowy obiekt Kontakt i dodaj go do listaKontaktow. Obsłuż kliknięcie przycisku „Edytuj”. Sprawdź, czy użytkownik zaznaczył wiersz w DataGridView.Pobierz zaznaczony obiekt Kontakt, przekaż go do formularza KontaktForm w trybie edycji. Obsłuż kliknięcie przycisku „Usuń”. Sprawdź, czy użytkownik zaznaczył wiersz. Zapytaj użytkownika o potwierdzenie (np. MessageBox.Show() z Yes/No).Usuń zaznaczony kontakt z listaKontaktow.
Dodaj paginację. Najpierw musimy dodać odpowiednie właściwości, które będą kontrolować paginację. Zmienna currentPage będzie przechowywać numer bieżącej strony, a pageSize liczbę kontaktów wyświetlanych na jednej stronie. Dodaj te zmienne do klasy. Obsłuż przyciski typu «, <, 1, 2, 3, >, ». Przycisków ze stronami powinno być tyle ile stron. Wyświetl tylko określoną liczbę kontaktów na stronie (np. 10). Przelicz stronę i aktualizuj DataGridView.
Zaimplementuj import i eksport kontaktów przez wybranie odpowiednich opcji w menu.