Struktury i listy w Visual Studio C#. Część 2: Operacje na liście
Materiał nawiązuje do poprzedniej lekcjii jest rozbudową poprzedniego projektu. W tym temacie zostanie poruszony problem przeglądania listy element po elemencie, przejście do wybranego elementu listy, usunięcie wybranego elementu listy oraz usunięcie całej listy.
Cel: Napisz aplikację, która na utworzonej liście danych wykona przeglądanie elementów listy oraz usuwanie wybranego elementu listy jak i całej listy
Krok1. Układ komponentów
Do projektu z poprzedniego tematu dodajemy elementy ułatwiające nawigację w liście danych
- Button- sztuk 7
- Label- sztuk 1
- TextBox- sztuk 1
Proponowane rozmieszczenie kontrolek przedstawia poniższy rysunek
Krok 2. Modyfikujemy funkcję dodaj() z poprzedniego tematu
Modyfikacja funkcji dodaj() z poprzedniego tematu będzie zawierać wartość bieżącego indeksu listy.
Deklarujemy prywatną zmienną do przechowywania bieżącego indeksu
Wskazówka:
public partial class Form1 : Form
{
private Dane d;
private List<Dane> lista = new List<Dane>();
private int idBiezacy = 0;
Modyfikujemy funkcję dodaj() do poniższej postaci
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;
}
Krok 3. Piszemy funkcję ustawiającą przeglądanie danych na bieżący element listy
Podstawą działania przeglądania listy jest uniwersalna funkcja odczytująca dane dowolnego elementu listy- rekordu listy. Pamiętamy, że naszymi elementami są dane oparte na zdefiniowanej strukturze w poprzednim temacie.
Nasza funkcja odczytując dane z dowolnego indeksu będzie o dwóch argumentach. Pierwszym argumentem jest indeks elementu, drugim parametrem jest kontrolka typu TextBox (w kontrolce tej będzie pokazywany odczytany rekord danych)
Wskazówka:
private void pokazRekord(int id, TextBox tb)
{
if (id < 0 || id>lista.Count-1) return;
d = lista[id];
tb.Clear();
tb.AppendText((id+1).ToString() + Environment.NewLine);
tb.AppendText(d.nazwisko + Environment.NewLine);
tb.AppendText(d.imie + Environment.NewLine);
tb.AppendText(d.klasa + Environment.NewLine);
}
Wywołanie powyższej funkcji zrealizujemy w zdarzeniu Click kontrolki Button
Wskazówka:
private void button3_Click(object sender, EventArgs e)
{
pokazRekord(idBiezacy, textBox4);
}
Sprawdź efekt działania aplikacji (na tym etapie utworzonego kodu wynikiem jest zwsze ostatni dopisny rekord danych do listy)
Krok 4. Metoda ustawiająca przeglądanie listy na pierwszy element
Rozwiązanie tego problemu jest proste. Wystarczy przypisać bieżący indeks na wartość zero i wywołać naszą funkcję pokazRekor.
Wskazówka:
private void button4_Click(object sender, EventArgs e)
{
//pokaz pierwszy rekord
idBiezacy = 0;
pokazRekord(idBiezacy, textBox4);
}
Sprawdź efekt działania aplikacji
Krok 5. Metoda ustawiająca przeglądanie listy na ostatni element
Ustawiamy bieżący indeks na ostatni element
Wskazówka:
private void button7_Click(object sender, EventArgs e)
{
//pokaz ostatni rekord
idBiezacy = lista.Count-1;
pokazRekord(idBiezacy, textBox4);
}
Sprawdź efekt działania aplikacji
Krok 6. Przeglądanie listy w lewo
Przez przeglądanie listy w lewo, rozumie się przeglądanie elementów od bieżącej pozycji w stronę indeksów mniejszych. Metodę przeglądania musimy zabezpieczyć przed przekroczeniem wartości bieżącego indeksu poniżej zera.
Wskazówka:
private void button5_Click(object sender, EventArgs e)
{
//pokaz kolejny rekord z lewej
idBiezacy--;
if (idBiezacy < 0) idBiezacy = 0;
pokazRekord(idBiezacy, textBox4);
}
Sprawdź efekt działania aplikacji
Krok 7. Przeglądanie listy w prawo
Przez przeglądanie listy w lewo, rozumie się przeglądanie elementów od bieżącej pozycji w stronę indeksów większych. Metodę przeglądania musimy zabezpieczyć przed przekroczeniem wartości bieżącego indeksu powyżej górnego zakresu.
Wskazówka:
private void button6_Click(object sender, EventArgs e)
{
//pokaz kolejny rekord z prawej
idBiezacy++;
if (idBiezacy >lista.Count-1) idBiezacy = lista.Count - 1;
pokazRekord(idBiezacy, textBox4);
}
Sprawdź efekt działania aplikacji
Krok 8. Przeglądanie dowolnego elementu listy
Przeglądanie dowolnego elementu listy możemy zrealizować w zdarzeniu zwolnienia klawisza edycyjnego w kontrolce TextBox. Zakładamy, że nie będziemy wprowadzać wartości innych niż z klawiszy numerycznych
Wskazówka:
private void textBox5_KeyUp(object sender, KeyEventArgs e)
{
if (textBox5.Text.Length < 1)
{
idBiezacy = 0;
textBox5.Text = "1";
}
else
{
idBiezacy = Convert.ToInt16(textBox5.Text) - 1;
}
pokazRekord(idBiezacy, textBox4);
}
Sprawdź efekt działania programu
Krok 9. Usunięcie bieżącego elementu z listy
Usuwanie bieżącego elemntu listy polega na wywołaniu funkcji RemoveRange z klasy List. Jest to funkcja dwuargumentowa. Pierwszym argumentem jest indeks elementu usuwanego, drugim jest ilość usuwanych elementów.
Wskazówka:
private void button10_Click(object sender, EventArgs e)
{
lista.RemoveRange(idBiezacy, 1);
toolStripStatusLabel1.Text = lista.Count.ToString();
}
Sprawdź efekt działania programu
Po usunięciu wybranego elementu można pokazać pełną zawartość listy. Usuniętego elementu nie powinno na liście być
Krok 10. Usunięcie całej listy
Myślę, że kod nie wymaga wyjaśnień
Wskazówka:
private void button9_Click(object sender, EventArgs e)
{
lista.Clear();
toolStripStatusLabel1.Text = lista.Count.ToString();
}
Sprawdź efekt działania programu
Rozwiązanie pod konsolę
Tak samo działający kod ale dla konsoli
Wskazówka:
namespace struktura_listy_konsola_cz2
{
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 pokazRekord(int id)
{
if (id < 0 || id > lista.Count - 1) return;
d = lista[id];
Console.WriteLine("\n"+id+ "\t"
+ d.nazwisko + "\t"
+ d.imie + "\t"
+ d.klasa);
}
static void pokazPierwszyRekord()
{
//pokaz pierwszy rekord
idBiezacy = 0;
pokazRekord(idBiezacy);
}
static void pokazOstatniRekord()
{
//pokaz ostatni rekord
idBiezacy = lista.Count - 1;
pokazRekord(idBiezacy);
}
static void pokazKolejnyLewy()
{
//pokaz kolejny rekord z lewej
idBiezacy--;
if (idBiezacy < 0) idBiezacy = 0;
pokazRekord(idBiezacy);
}
static void pokazKolejnyPrawy()
{
//pokaz kolejny rekord z prawej
idBiezacy++;
if (idBiezacy > lista.Count - 1) idBiezacy = lista.Count - 1;
pokazRekord(idBiezacy);
}
static void pokazWybrany()
{
Console.WriteLine("\nPodaj indeks: ");
idBiezacy = int.Parse(Console.ReadLine());
pokazRekord(idBiezacy);
}
static void usunBiezacy()
{
lista.RemoveRange(idBiezacy, 1);
}
static void Main(string[] args)
{
Console.WriteLine("Witaj w CzD!");
Console.WriteLine("Wybierz działanie\n" +
"+- dodaj dane\n" +
"p- pokaz listę\n" +
"r- pokaz biezacy\n" +
"a- pokaz pierwszy\n" +
"<- przeglądaj w lewo\n" +
">- przeglądaj w prawo\n" +
"w- pokaz wybrany o indeksie\n" +
"u- usuń bieżący\n" +
"Esc- koniec");
ConsoleKeyInfo klawiszInfo;
do
{
klawiszInfo = Console.ReadKey();
switch (klawiszInfo.KeyChar)
{
case '+': dodaj(); break;
case 'p': pokazListe(); break;
case 'r': pokazRekord(idBiezacy); break;
case 'a': pokazPierwszyRekord(); break;
case 'z': pokazOstatniRekord(); break;
case '<': pokazKolejnyLewy(); break;
case '>': pokazKolejnyPrawy(); break;
case 'w': pokazWybrany(); break;
case 'u': usunBiezacy(); break;
}
} while (klawiszInfo.Key != ConsoleKey.Escape);
}
}
}
Wynik działania powyższego kodu pokazuje poniższa ilustracja