Struktury i listy w Visual Studio C#. Część 1
Czym jest struktura danych? Struktura danych to rozbudowany typ wartościowy, który pozwala przy pomocy jednej zmiennej przechowywać wiele zmiennych o różnych wartościach.
Struktura danych odpowiada pojedynczemu wierszowi dowolnej tabeli, w której to kolumny są typami danych przechowywanych w takim wierszu tabeli.
Lista, jest to typ danych odpowiadający kolekcji przypisanych elementów. Elementami danych mogą być typy proste, typy złożone- struktury, klasy. Listy ułatwiają pracę ze zbirami danych.
Cel: Napisz aplikację przechowującą dane w postaci: nazwisko, imię, klasa, które są dodawane do listy
Krok 1. Układ komponentów
- GroupBox- sztuk 3
- StatusStrip- sztuk 1
- Label- sztuk 3
- Button- sztuk 3
- TextBox- sztuk 4
Proponowane rozmieszczenie kontrolek przedstawia poniższy rysunek
W kontrolce StatusStrip uaktywniamy kontrolkę toolStripStatusLabel1
W tym miejscy będziemy wyświetlać informację o aktualnej ilości wpisanych rekordów danych do listy
Całą listę danych będziemy pokazywać w jednej z kontrolek TextBox. Wybranej kontrolce właściwość pola Dock ustaw na Fill
Przypisz tryb pracy w układzie wielu linii.
Dodaj możliwość przewijania zawartości w pionie
Krok 2. Deklarujemy strukturę danych
Deklaracja typu sktrukturalnego odbywa się na podobnych zasadach co innych typów zmiennych. Podajemy nazwę tworzonej struktury oraz nazwę przechowywanych pól, którym nadajemy status publiczny (dzięki czemu będą dostępne spoza struktury)
Wskazówka:
using System.Windows.Forms;
struct Dane
{
public string nazwisko;
public string imie;
public string klasa;
}
Krok 3. Deklaracja zmiennej strukturalnej i listy
Kod tworzonej aplikacji wymaga zadeklarowania zmiennej utworzonej na zadeklarowanej strukturze danych oraz listy opartej na tej strukturze.
Wskazówka:
public partial class Form1 : Form
{
private Dane d;
private List<Dane> lista = new List<Dane>();
private int idBiezacy = 0;
public Form1()
Po skompilowaniu i uruchomieniu projektu nic nie będzie wykonywane przez program, dopóki nie zaprogramujemy dodawania i wyświetlania elementów listy danych
Krok 4. Funkcja dodająca dane do listy
Napiszemy dwie funkcje pracujące na utworzonej strukturze danych. Jedna z funkcji będzie czyścić zmienną opisaną strukturze, a druga przypisywać jej nowe wartości i dodawać jako kolejny element do listy
Wskazówka:
private void czyscDana()
{
d.nazwisko = "";
d.imie = "";
d.klasa = "";
}
Funkcja czyscDana() wywołana jest w funkcji dodaj()
Wskazówka:
private void dodaj()
{
czyscDana();
d.nazwisko = textBox1.Text;
d.imie = textBox2.Text;
d.klasa = textBox3.Text;
lista.Add(d);
idBiezacy = lista.Count - 1;
}
Skompiluj program i sprawdź czy nie zawiera błędów kompilacji
Krok 5. Dodajemy kolejne rekordy danych do listy
W zdarzeniu Click przycisku button1 wywołamy funkcje dodającą rekordy danych oraz wyświetlimy informacje o ilości dodanych elementów
Wskazówka:
private void Button1_Click(object sender, EventArgs e)
{
dodaj();
toolStripStatusLabel1.Text = lista.Count.ToString();
}
Uruchom program i sprawdź jak zmienia się licznik dodawanych elementów
Krok 6. Wyświetlamy całą zawartość listy
Wyświetlenie na ekranie monitora kolejnych elementów listy wymaga użycia dowolnej pętli, która odczyta zgromadzone dane i pokaże je w wybranej kontrolce TextBox, która będzie podawana do ciała funkcji jako jej parametr
Proponowany kod ma postać
Wskazówka:
private void pokazListe(TextBox tb)
{
tb.Clear();
for(int i = 0; i < lista.Count;i++)
{
tb.AppendText((i+1).ToString()+"*******************"+ Environment.NewLine);
tb.AppendText(lista[i].nazwisko + Environment.NewLine);
tb.AppendText(lista[i].imie + Environment.NewLine);
tb.AppendText(lista[i].klasa + Environment.NewLine);
}
}
Wywołanie tej funkcji przypiszemy do zdarzenia Click przycisku button2
Wskazówka:
private void button2_Click(object sender, EventArgs e)
{
pokazListe(textBox4);
}
Skompiluj program i sprawdź efekt działania
Ćwiczenie sprawdzające: Dopisz funkcję czyszczącą pola edycyjne
Pełny kod
Poniżej podaje pełny kod rozwiązania dla aplikacji desktopowej
Wskazówka:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
struct Dane
{
public string nazwisko;
public string imie;
public string klasa;
}
namespace _29StrukturyListy
{
public partial class Form1 : Form
{
private Dane d;
private List<Dane> lista = new List<Dane>();
private int idBiezacy = 0;
public Form1()
{
InitializeComponent();
}
private void czyscDana()
{
d.nazwisko = "";
d.imie = "";
d.klasa = "";
}
private void dodaj()
{
czyscDana();
d.nazwisko = textBox1.Text;
d.imie = textBox2.Text;
d.klasa = textBox3.Text;
lista.Add(d);
idBiezacy = lista.Count - 1;
}
private void pokazListe(TextBox tb)
{
tb.Clear();
for(int i = 0; i < lista.Count;i++)
{
tb.AppendText((i+1).ToString()+"*******************"+ Environment.NewLine);
tb.AppendText(lista[i].nazwisko + Environment.NewLine);
tb.AppendText(lista[i].imie + Environment.NewLine);
tb.AppendText(lista[i].klasa + Environment.NewLine);
}
}
private void Button1_Click(object sender, EventArgs e)
{
dodaj();
toolStripStatusLabel1.Text = lista.Count.ToString();
}
private void button2_Click(object sender, EventArgs e)
{
pokazListe(textBox4);
}
private void button8_Click(object sender, EventArgs e)
{
textBox1.Clear();
textBox2.Clear();
textBox3.Clear();
}
}
}
Rozwiązanie pod konsolę
Pisząc rozwiązanie pod konsolę projektujemy proste menu, a pozostałe funkcje nieznacznie się różnią od tych napisanych dla rozwiązania desktopowego. Poniżej kod rozwiązania dla konsoli:
Wskazówka:
namespace struktury_listy_konsola_cz1
{
struct Dane
{
public string nazwisko;
public string imie;
public string klasa;
}
internal class Program
{
static Dane d;
static List<Dane> lista = new List<Dane>();
static int idBiezacy = 0;
static void czyscDana()
{
d.nazwisko = "";
d.imie = "";
d.klasa = "";
}
static void dodaj()
{
czyscDana();
Console.WriteLine("nazwisko: ");
d.nazwisko = Console.ReadLine();
Console.WriteLine("imię: ");
d.imie = Console.ReadLine();
Console.WriteLine("klasa: ");
d.klasa = Console.ReadLine();
lista.Add(d);
idBiezacy = lista.Count - 1;
}
static void pokazListe()
{
Console.WriteLine("nr\tnazwisko\timię\tklasa");
for (int i = 0; i < lista.Count; i++)
{
Console.WriteLine((i+1)+"\t"
+ lista[i].nazwisko + "\t"
+ lista[i].imie + "\t"
+ lista[i].klasa);
}
}
static void Main(string[] args)
{
Console.WriteLine("Witaj w CzD!");
Console.WriteLine("Wybierz działanie\n" +
"+- dodaj dane\n" +
"p- pokaz listę\n" +
"Esc- koniec");
ConsoleKeyInfo klawiszInfo;
do
{
klawiszInfo = Console.ReadKey();
switch (klawiszInfo.KeyChar)
{
case '+': dodaj(); break;
case 'p': pokazListe(); break;
}
} while (klawiszInfo.Key != ConsoleKey.Escape);
}
}
}
Poniżej zrzut ekranu rozwiązania konsolowego