1
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 Dim – słowo kluczowe,
o nazwa tablicy - zasada ta sama jak przy tworzeniu nazwy zmiennej.
o 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.
o 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 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
numery wierszy
5 6 12 24 48 96
Rysunek 1. Tabela Dane(5, 4), 6 wierszy i 5 kolumn;
element Dane(3,2) przechowuje wartość 16
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 DataGridView1.
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.
3 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.
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.
5 Zadanie
Utworzyć obiekt DataGridView o trzech kolumnach typu TextBox i przyciski obsługujące procedury o następujących działaniach, patrz rys. 7:
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
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).
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.
7 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 End Sub
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
End Sub
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
End Sub
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 End Sub
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
End Sub
9 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
End Sub
'...
'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
'...
'...
'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
'...