DATA
CZAS
IMIENINY
FAZA KSIĘŻYCA
STAFLOTA ⊕ SEKTOR ALFA · BITEDU STATION

Etapy Projektu

Etap 1: Utworzenie nowego projektu

Etap 2: Projektowanie interfejsu (UI)

W Projektancie Formy (Form1):

Etap 3: Dodanie logiki (Code-Behind)

Przechodzimy do pliku Form1.cs.

a) Wyświetlanie listy zadań

b) Metoda dodawania zadania (opisane poniżej)

Etap 4: Testowanie programu

Etap 5: Opcjonalne ulepszenia


📚 Co robi nasz program Organizer?

Nasz program pozwala:

Czyli mamy trzy główne akcje: Dodaj, Usuń, Zatwierdź zmiany.


📋 Jak działa każdy element?

Przyciski i pole tekstowe

W programie mamy:


📄 Opis metod (funkcji) w programie

Metoda: 
btnAdd_Click

Co robi?

Prosty język:

Jeśli coś wpiszesz i klikniesz “Dodaj notatkę”, to notatka pojawi się na liście.

// Dodawanie nowej notatki

        private void btnAdd_Click(object sender, EventArgs e)
        {
            if (!string.IsNullOrWhiteSpace(txtTask.Text))
            {
                listBoxTasks.Items.Add(txtTask.Text);
                txtTask.Clear();
                btnSaveChanges.Visible = false; // Ukryj przycisk edytowania
            }
            else
            {
                MessageBox.Show("Wpisz treść notatki!", "Uwaga", MessageBoxButtons.OK, MessageBoxIcon.Warning);
            }
        }

Metoda: 
btnRemove_Click

Co robi?

Prosty język:

Jeśli klikniesz notatkę na liście i klikniesz “Usuń notatkę”, to ta notatka zniknie.

// Usuwanie zaznaczonej notatki

        private void btnRemove_Click(object sender, EventArgs e)
        {
            if (listBoxTasks.SelectedItem != null)
            {
                listBoxTasks.Items.Remove(listBoxTasks.SelectedItem);
                txtTask.Clear();
                btnSaveChanges.Visible = false; // Ukryj przycisk edytowania
            }
            else
            {
                MessageBox.Show("Wybierz notatkę do usunięcia.", "Uwaga", MessageBoxButtons.OK, MessageBoxIcon.Warning);
            }
        }

Metoda: 
listBoxTasks_SelectedIndexChanged

Co robi?

Prosty język:

Klikniesz notatkę na liście — zobaczysz jej tekst w polu wpisywania i możesz ją zmieniać.

// Wyświetlanie treści zaznaczonej notatki w polu edycji

        private void listBoxTasks_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (listBoxTasks.SelectedItem != null)
            {
                txtTask.Text = listBoxTasks.SelectedItem.ToString();
                btnSaveChanges.Visible = true; // Pokaż przycisk edycji
            }
        }

Metoda: 
btnSaveChanges_Click

Co robi?

Prosty język:

Wpiszesz zmiany w notatce i klikniesz “Zatwierdź zmiany” — wtedy notatka na liście się zmieni.

// Zatwierdzenie zmienionej notatki

        private void btnSaveChanges_Click(object sender, EventArgs e)
        {
            if (listBoxTasks.SelectedIndex != -1 && !string.IsNullOrWhiteSpace(txtTask.Text))
            {
                int selectedIndex = listBoxTasks.SelectedIndex;
                listBoxTasks.Items[selectedIndex] = txtTask.Text;
                listBoxTasks.ClearSelected();
                txtTask.Clear();
                btnSaveChanges.Visible = false; // Ukryj po zatwierdzeniu
            }
        }

🔥 Jak przebiega cały proces działania programu?

  1. Wpisujesz coś do pola tekstowego i klikasz “Dodaj notatkę” → notatka pojawia się na liście.
  2. Klikasz notatkę na liście → tekst z tej notatki pojawia się w polu.
  3. Możesz zmienić tekst i kliknąć “Zatwierdź zmiany” → notatka zostanie zaktualizowana.
  4. Możesz też zaznaczyć notatkę i kliknąć “Usuń notatkę” → zniknie z listy.

🧠 Uwaga techniczna:

PODSUMOWANIE I WYJAŚNIENIE UŻYTYCH FUNKCJI:

Funkcja / polecenieCo robi?Gdzie było użyte?
InitializeComponent()Tworzy wszystkie elementy oknaKonstruktor Form1()
string.IsNullOrWhiteSpace(txtTask.Text)Sprawdza, czy pole tekstowe nie jest puste lub składające się tylko ze spacjibtnAdd_Click, btnSaveChanges_Click
listBoxTasks.Items.Add(txtTask.Text)Dodaje nową notatkę do listybtnAdd_Click
txtTask.Clear()Czyści pole tekstowebtnAdd_Click, btnRemove_Click, btnSaveChanges_Click
btnSaveChanges.Visible = falseUkrywa przycisk “Zatwierdź zmiany”btnAdd_Click, btnRemove_Click, btnSaveChanges_Click
MessageBox.Show()Wyświetla okienko z komunikatembtnAdd_Click, btnRemove_Click
listBoxTasks.SelectedItem != nullSprawdza, czy jakaś notatka jest zaznaczona na liściebtnRemove_Click, listBoxTasks_SelectedIndexChanged
listBoxTasks.Items.Remove(listBoxTasks.SelectedItem)Usuwa zaznaczoną notatkę z listybtnRemove_Click
listBoxTasks.SelectedIndex != -1Sprawdza, czy jakaś notatka jest zaznaczona (indeks)btnSaveChanges_Click
listBoxTasks.SelectedIndexPobiera numer (indeks) zaznaczonej notatkibtnSaveChanges_Click
listBoxTasks.Items[selectedIndex] = txtTask.TextAktualizuje treść notatki na liściebtnSaveChanges_Click
listBoxTasks.ClearSelected()Odznacza wszystkie zaznaczone notatki na liściebtnSaveChanges_Click
txtTask.Text = listBoxTasks.SelectedItem.ToString()Kopiuje treść klikniętej notatki do pola tekstowegolistBoxTasks_SelectedIndexChanged
btnSaveChanges.Visible = truePokazuje przycisk “Zatwierdź zmiany”listBoxTasks_SelectedIndexChanged

Windows Forms.NET MAUI – odpowiednikUwagi
ListBoxListViewListView w MAUI obsługuje kolekcje obiektów – nie ma metody .Items.Add() – trzeba używać ItemsSource
TextBoxEntryEntry to jednoliniowe pole tekstowe, Editor to wieloliniowe
ButtonButtonNazwa ta sama, działanie podobne
LabelLabelTeż podobne
MessageBox.Show()DisplayAlert()Używane do wyświetlania okienek z komunikatami
Visible = falseIsVisible = falseZamiast Visible, w MAUI używamy IsVisible


W Windows Forms obsługujesz zdarzenia typu Click przez btnAdd_Click(object sender, EventArgs e) – w MAUI też możesz, ale używasz Clicked i możesz wiązać je bezpośrednio w XAML (Clicked=”btnAdd_Click”).


Wersja dla MAUI

Logika:

using System.Collections.ObjectModel;

public partial class MainPage : ContentPage
{
    private ObservableCollection<string> tasks = new ObservableCollection<string>();

    public MainPage()
    {
        InitializeComponent();
        listBoxTasks.ItemsSource = tasks;
    }

    private void btnAdd_Click(object sender, EventArgs e)
    {
        if (!string.IsNullOrWhiteSpace(txtTask.Text))
        {
            tasks.Add(txtTask.Text);
            txtTask.Text = "";
            btnSaveChanges.IsVisible = false;
        }
        else
        {
            DisplayAlert("Uwaga", "Wpisz treść notatki!", "OK");
        }
    }

    private void btnRemove_Click(object sender, EventArgs e)
    {
        if (listBoxTasks.SelectedItem != null)
        {
            tasks.Remove(listBoxTasks.SelectedItem.ToString());
            txtTask.Text = "";
            btnSaveChanges.IsVisible = false;
        }
        else
        {
            DisplayAlert("Uwaga", "Wybierz notatkę do usunięcia.", "OK");
        }
    }

    private void listBoxTasks_SelectedIndexChanged(object sender, SelectedItemChangedEventArgs e)
    {
        if (e.SelectedItem != null)
        {
            txtTask.Text = e.SelectedItem.ToString();
            btnSaveChanges.IsVisible = true;
        }
    }

    private void btnSaveChanges_Click(object sender, EventArgs e)
    {
        if (listBoxTasks.SelectedItem != null && !string.IsNullOrWhiteSpace(txtTask.Text))
        {
            var oldItem = listBoxTasks.SelectedItem.ToString();
            int index = tasks.IndexOf(oldItem);
            tasks[index] = txtTask.Text;

            listBoxTasks.SelectedItem = null;
            txtTask.Text = "";
            btnSaveChanges.IsVisible = false;
        }
    }
}

projektant:

<VerticalStackLayout Padding="20" Spacing="15">

    <Label x:Name="label1"
           Text="Twoje zadania:"
           FontSize="20"
           HorizontalOptions="Center" />

    <ListView x:Name="listBoxTasks"
              HeightRequest="200"
              SelectionMode="Single"
              ItemSelected="listBoxTasks_SelectedIndexChanged" />

    <Label x:Name="label2"
           Text="Nowe zadanie:"
           FontAttributes="Bold" />

    <Entry x:Name="txtTask"
           Placeholder="Wpisz treść notatki" />

    <HorizontalStackLayout Spacing="10">
        <Button x:Name="btnAdd"
                Text="Dodaj notatkę"
                Clicked="btnAdd_Click"
                HorizontalOptions="FillAndExpand" />

        <Button x:Name="btnRemove"
                Text="Usuń notatkę"
                Clicked="btnRemove_Click"
                HorizontalOptions="FillAndExpand" />
    </HorizontalStackLayout>

    <Button x:Name="btnSaveChanges"
            Text="Zatwierdź zmiany"
            Clicked="btnSaveChanges_Click"
            IsVisible="False"
            BackgroundColor="LightGreen"
            TextColor="Black" />
</VerticalStackLayout>

Co musiałem zmienić, by przenieść aplikację desktopową z Windows Forms do aplikacji mobilnej w .NET MAUI i dlaczego?

W moim oryginalnym projekcie desktopowym korzystałem z technologii Windows Forms, gdzie interfejs użytkownika tworzy się za pomocą wizualnego edytora i kontrolek takich jak ListBox, TextBox, Button. Chciałem jednak, aby aplikacja działała na urządzeniach mobilnych – więc postanowiłem przenieść ją do .NET MAUI.

Aby to zrobić, musiałem zmienić kilka istotnych elementów:


1. Kontrolki UI (interfejsu użytkownika)

W Windows Forms używałem kontrolek takich jak ListBox, TextBox, Label i Button. W .NET MAUI nie wszystkie te kontrolki istnieją w takiej samej formie – dlatego:


2. Zarządzanie danymi w liście

W Windows Forms mogłem łatwo dodawać elementy do ListBox przez listBox.Items.Add(…). W MAUI ListView nie ma takiej metody – potrzebuje źródła danych (ItemsSource). Dlatego musiałem stworzyć kolekcję typu ObservableCollection<string>, którą przypiąłem do ItemsSource.

Ta zmiana była konieczna, żeby lista dynamicznie reagowała na dodawanie, usuwanie i edytowanie elementów.


3. Zdarzenia i aktualizacja danych

W Windows Forms miałem dostęp do SelectedIndex i SelectedItem. W MAUI dostępny jest tylko SelectedItem, więc musiałem samodzielnie znaleźć indeks danego elementu, aby go zaktualizować w kolekcji.

Musiałem też dostosować metodę btnSaveChanges_Click, żeby zamiast podmiany przez listBox.Items[index] = …, podmieniała element w ObservableCollection poprzez tasks[index] = ….


4. UI w XAML

Zamiast przeciągać kontrolki na formę, musiałem zbudować interfejs ręcznie w pliku MainPage.xaml używając języka XAML. To pozwala lepiej dostosować wygląd aplikacji do ekranów mobilnych i ułatwia kontrolę nad layoutem.


5. Platforma docelowa i środowisko uruchomieniowe

Musiałem też zmienić szablon projektu – zamiast Windows Forms App (.NET Framework) wybrałem MAUI App, co pozwoliło mi uruchomić aplikację na Androidzie i innych platformach mobilnych.