Tablice, DataGridView Gdy rośnie liczba danych do przechowywania w programie, a następnie ich obrobienia - pojawiają się nowe struktury danych (moŝna by powiedzieć pojemniki na dane) zwane tablicami. Tablica moŝe przechowywać wiele danych. Wszystkie one będą tego samego typu, będą miały tę samą nazwę (nazwę tablicy), a do poszczególnych danych zawartych w tablicy odwołujemy się za pomocą indeksów (kolejnych numerów tych danych w tablicy). Tablice mogą być jednowymiarowe (np. wektor), dwuwymiarowe (np. szachownica) i wielowymiarowe (np. prostopadłościan,...). Tworzenie tablicy Tworzenie tablicy to jej deklarowanie. Tablicę deklarujemy tak jak zmienną, musimy określić jej nazwę, liczbę wymiarów, rozmiary tych wymiarów, typ danych w tablicy. Pierwszy element tablicy ma zawsze index zero, 0. Przykłady: Dim studenci(14) As String deklaracja tablicy jednowymiarowej, przechowującej nazwiska UWAGA: 15 studentów. Odwołanie do pierwszego elementu tablicy to: studenci(0). Dim temperatury(11,30) deklaracja tablicy o 12 wierszach (od 0 do 11) i 31 kolumnach (od 0 do 30), np. do przechowywania max. temperatury kaŝdego dnia w roku. W wierszach będą numery miesięcy (styczeń 0, luty 1, marzec 2, itd.), a w kolumnach numery dni. Temperatura w dniu 1-go kwietnia to będzie komórka tabeli: temperatury(3, 0). o o o o Dim słowo kluczowe, nazwa tablicy - zasada ta sama jak przy tworzeniu nazwy zmiennej. liczba wymiarów wynika z liczby elementów w nawiasie oddzielonych przecinkami. nazwatablicy(9) jednowymiarowa, nazwatablicy(3, 5) dwuwymiarowa, nazwatablicy(3,10,18) trójwymiarowa. rozmiary tych wymiarów wartości liczb w nawiasie nazwatablicy(9) jednowymiarowa o 10 elementach numerowanych od 0 do 9, nazwatablicy(5, 4) dwuwymiarowa o 6 wierszach od 0 do 5 i 5 kolumnach takŝe od 0 do 4, rys.1. nazwatablicy(3,10,19) trójwymiarowa (jakby prostopadłościan) o 4 wierszach numerowanych od 0 do 3, 11 kolumnach numerowanych od 0 do 10 i 20 warstwach (poziomach) od 0 do 19. Przykład: Narysować tabelę Dane(5,4), w której komórki kaŝdej następnej kolumny zawierają wartości dwa razy większe od sąsiednich komórek w kolumnie poprzedniej, rys. 1. numery wierszy numery kolumn 0 1 2 3 4 0 1 2 4 8 16 1 2 4 8 16 32 2 3 6 12 24 48 3 4 8 16 32 64 4 5 10 20 40 80 5 6 12 24 48 96 Rysunek 1. Tabela Dane(5, 4), 6 wierszy i 5 kolumn; element Dane(3,2) przechowuje wartość 16 Copyright 2014, mgr inŝ. Janusz Bonarowski 1
Krótkie omówienie obiektu DataGridView Często potrzebujemy obiektu, który wyświetliłby tabelę zawierającą kilka kolumn i kilka wierszy. Dobrze do tego celu nadaje się obiekt DataGridView 1. Po przeniesieniu obiektu na formularz jest on pusty brak kolumn i wierszy - pojawi się jednak podręczna lista zadań (DataGridView Tasks), rys. 2, z której moŝemy wybrać potrzebne działania. Rysunek 2 Aby dodawać kolumny wybieramy z listy zadań Add Column..., co wywoła okno dodawania kolumn, rys. 3. Rysunek 3. Dodawanie kolumny Po kliknięciu przycisku dodana zostanie kolumna, rys. 4. Proszę zwrócić uwagę na wartość pozycji Type: DataGridViewTextBoxColumn (rys. 3), wybranie takiego typu komórek dla kolumny oznacza, Ŝe wszystkie komórki w dodanej kolumnie będą typu TextBox, rys.4. 1 Podstawowym zastosowaniem obiektu DataGridView jest wizualizacja zawartości baz danych, moŝna jednak takŝe wyświetlać zawartość zwykłych tablic, co pokazano w omawianej dalej aplikacji. Copyright 2014, mgr inŝ. Janusz Bonarowski 2
Rysunek 4. DataGridView po dodaniu kolumny z komórkami typu tekstowego MoŜemy dodawać kolumny typu, rys. 5: Przycisk DataGridViewButtonColumn Kratka wyboru DataGridViewCheckBoxColumn ListaRozwijalna DataGridViewComboBoxColumn Rysunek DataGridViewImageColumn Odsyłacz DataGridViewLinkColumn Okno tekstowe - DataGridViewTextBoxColumn Rysunek 5. Wybór typu kolumny Aby sprawdzić postać wiersza z komórkami róŝnego typu, moŝemy testowo zdefiniować 6 kolumn o typach: (Column1) TextBox, (Column2) CheckBox, (Column3) ComboBox, (Column4) Image, (Column5) Link, (Column6) Button. Copyright 2014, mgr inŝ. Janusz Bonarowski 3
W kaŝdej chwili moŝna zmienić wszystkie elementy w projektowanym obiekcie DataGridView. W tym celu naleŝy z listy zadań wybrać pozycję Edit Column, rys. 6 (pozycja1), co otworzy formularz edycji kolumn, rys. 6 (pozycja 2). Rysunek 6. Edycja właściwości i rozmieszczenia kolumn Narzędzia tego formularza pozwalają zmieniać połoŝenie kolumny w wierszu (pozycja 3), właściwości wskazanej kolumny (pozycja 4), dodawać i usuwać kolumny (pozycja 5). Aby opanować dostęp do komórek obiektu DataGridView wykonajmy następujące zadanie. Copyright 2014, mgr inŝ. Janusz Bonarowski 4
Zadanie Utworzyć obiekt DataGridView o trzech kolumnach typu TextBox i przyciski obsługujące procedury o następujących działaniach, patrz rys. 7: 1. Zapełnić Grid o 4 wierszach i 3 kolumnach kolejnymi liczbami całkowitymi. 2. Zapełnić Grid o 3 wierszach i 3 kolumnach liczbą 1 na przekątnej głównej. 3. Zapełnić Grid o 3 wierszach i trzech kolumnach liczbą 2 na drugiej przekątnej. 4. Usunąć wiersz z indeksem 0. 5. Usunąć wiersz z indeksem 1. 6. Usunąć wiersz wskazany myszą (kliknięty). Rysunek 7. Propozycja formularza Sposób odwołania się do pojedynczej komórki w celu pobrania/wstawienia wartości pokazuje rys. 8. Uwaga: NaleŜy podkreślić, Ŝe komórki (kolumny i wiersze) numerowane są od 0 i odwołujemy się do nich w kolejności najpierw kolumna potem wiersz: Item(kolumna, wiersz), a nie Tablica(wiersz, kolumna) jak w tablicach. Rysunek 8. Sposób zapełnienia komórek Copyright 2014, mgr inŝ. Janusz Bonarowski 5
Budowę aplikacji rozpoczniemy od umieszczenia na formularzu obiektu DataGridView1 i utworzenia w nim jednego wiersza o 3 kolumnach, patrz rys. 3 pozycja Add Column..., rys. 9, następnie dodamy 6 przycisków, jak na rys. 7, o przykładowych nazwach jak tablicy pod rysunkiem 9. Rysunek 9. Dodajemy wiersz o 3 kolumnach Name Text btn4x3_kolejne 4 wiersze x 3 kolumny, kolejne liczby btn3x3 przekatna_1 3 wiersze x 3 kolumny, 1 na przekątnej btn3x3_druga_przekatna_2 3 wiersze x 3 kolumny, 2 na drugiej przekątnej btnusun_wiersz_0 Usuń wiersz 0 btnusun_wiersz_1 Usuń wiersz 1 btnusunwskazanywiersz Usuń wskazany wiersz Skrócony opis metod i właściwości obiektu DataGridView zamieściłem w pliku vb6.01_gridview_skrot.pdf. PoniewaŜ znana jest liczba kolumn i wierszy (mamy je wskazane w poleceniu zadania na rys. 7), to do obsługiwania Gridu posłuŝymy się instrukcją For... Next, w której moŝemy określić ile razy cykl zostanie wykonany (w odróŝnieniu od instrukcji Do While...Loop, która moŝe być wykonywana "nie widomo ile razy"). Więcej informacji umieszczę w komentarzach, w kodzie. Copyright 2014, mgr inŝ. Janusz Bonarowski 6
Kody procedur Private Sub btn4x3_kolejne_click(byval sender As _ System.Object, ByVal e As System.EventArgs) _ Handles btn4x3_kolejne.click 'Zapełnianie siatki 4 wiersze na 3 kolumny kolejnymi liczbami. 'Uwaga na numerację kolumn i wierszy! 'numery 0 1 2 '-------+------------ ' 0 1 2 3 ' 1 4 5 6 ' 2 7 8 9 ' 3 10 11 12 '-------------------- Dim kol, wie, Liczba As Integer DataGridView1.Rows.Clear() Liczba = 0 For wie = 0 To 3 DataGridView1.Rows.Add() For kol = 0 To 2 Liczba = Liczba + 1 DataGridView1.Item(kol, wie).value = Liczba.ToString '--------------------------------------------------- Next Next Private Sub btn3x3 przekatna_jedynki_click(byval sender As _ Object, ByVal e As System.EventArgs) _ Handles btn3x3 przekatna_jedynki.click 'Wstawianie liczby 1 na głównej przekatnej '----------------------------------------- Dim i As Integer DataGridView1.Rows.Clear() For i = 0 To 2 DataGridView1.Rows.Add() DataGridView1.Item(i, i).value = "1" '----------------------------------- Next Private Sub btn3x3_druga_przekatna_2_click(byval sender As _ Object, ByVal e As System.EventArgs) _ Handles btn3x3_druga_przekatna_2.click 'Wstawianie liczby 2 na drugiej przekątnej '----------------------------------------- Dim i As Integer DataGridView1.Rows.Clear() For i = 0 To 2 DataGridView1.Rows.Add() DataGridView1.Item(2 - i, i).value = "2" '--------------------------------------- Next Copyright 2014, mgr inŝ. Janusz Bonarowski 7
Private Sub btnusun_wiersz_click(byval sender As _ System.Object, ByVal e As System.EventArgs) _ Handles btnusun_wiersz_0.click 'Usuwanie wiersza z indeksem 0 '----------------------------- Dim odp As DialogResult odp = MsgBox("Czy usunąć pierwszy wiersz (z indexem 0)?", _ MsgBoxStyle.Question + MsgBoxStyle.YesNo) Try If odp = Windows.Forms.DialogResult.Yes Then DataGridView1.Rows.RemoveAt(0) '----------------------------- End If Catch ex As Exception MsgBox(Err.Description & vbcrlf & _ "Tzn. takiego, który ma gwiazdkę",, _ "Błąd nr " & Err.Number) End Try Private Sub btnusun_wiersz_1_click(byval sender As _ System.Object, ByVal e As System.EventArgs) _ Handles btnusun_wiersz_1.click 'Usuwanie wiersza z indeksem 1 '----------------------------- Dim LiczbaWierszy As Integer Dim odp As DialogResult odp = MsgBox("Czy usunąć wiersz z indexem 1 (czyli drugi)?", _ MsgBoxStyle.Question + MsgBoxStyle.YesNo) Try If odp = Windows.Forms.DialogResult.Yes Then LiczbaWierszy = DataGridView1.Rows.Count If LiczbaWierszy - 1 >= 1 Then MsgBox("LiczbaWierszy=" & _ LiczbaWierszy.ToString & vbcrlf & _ "Spróbujemy usunąć") End If DataGridView1.Rows.RemoveAt(1) '----------------------------- End If Catch ex As Exception MsgBox(Err.Description,, "Błąd nr " & Err.Number) End Try Copyright 2014, mgr inŝ. Janusz Bonarowski 8
Private Sub btnusunwskazanywiersz_click(byval sender As _ System.Object, ByVal e As System.EventArgs) _ Handles btnusunwskazanywiersz.click 'Usuwanie wskazanego wiersza. 'Wiersz moŝna wskazać 'wskazując cały wiersz lub wskazując komórkę w wierszu '----------------------------------------------------- Dim NrWiersza As Integer NrWiersza = DataGridView1.SelectedCells.Item(0).RowIndex ' -------------------------------------------- Try DataGridView1.Rows.RemoveAt(NrWiersza) '------------------------------------- Catch ex As Exception MsgBox(Err.Description,, "Błąd nr " & Err.Number) End Try '... 'A gdyby naleŝało zapełnić siatkę kolejnymi liczbami, 'ale umieszczając je kolejno nie w wierszach lecz w kolumnach? ' 'numery 0 1 2 '-------+------------ ' 0 1 5 9 ' 1 2 6 10 ' 2 3 7 11 ' 3 4 8 13 '-------------------- '...................... 'Bez uŝycia tabeli jako elementu pośredniego... 'DataGridView1.Rows.Clear() 'usuwanie wierszy 'For wiersz = 0 To 3 ' DataGridView1.Rows.Add() ' Liczba = wiersz + 1 ' For kolumna = 0 To 2 ' DataGridView1.Item(kolumna, wiersz).value = Liczba.ToString ' '---------------------------------------------------------- ' Liczba = Liczba + 4 ' Next 'Next '... Copyright 2014, mgr inŝ. Janusz Bonarowski 9
'... 'Z uŝycim tabeli '............. 'Dim tabela(3, 2) As Integer '' Tworzenie tabeli 'DataGridView1.Rows.Clear() 'usuwanie wierszy 'For kolumna = 0 To 2 ' For wiersz = 0 To 3 ' Liczba = Liczba + 1 ' tabela(wiersz, kolumna) = Liczba ' Next 'Next ''Zapełnianie siatki wierszami 'For wiersz = 0 To 3 ' DataGridView1.Rows.Add() ' For kolumna = 0 To 2 ' DataGridView1.Item(kolumna, wiersz).value = _ tabela(wiersz, kolumna).tostring ' ------------------------------------------- ' Next 'Next '... Copyright 2014, mgr inŝ. Janusz Bonarowski 10