01 grid tablica grid Zadanie Wykonajmy aplikację posiadającą dwa obiekty DataGridView. Jeden o nazwie DataGridView1, będzie formularzem wejściowym, drugi o nazwie DataGridView2 będziemy używać jako element wyjściowy do wyświetlania tabeli z wynikami. Obiekt DataGridView (podczas działania aplikacji tzw. runtime) automatycznie dodaje kolejne wiersze wtedy gdy rozpoczniemy wpisywanie danych do bieżąco ostatniego wiersza edycyjnego budowana aplikacja nie wymaga zatem specjalnego narzędzia (przycisku) pozwalającego dodawać wiersze. Natomiast dodawanie kolumny podczas działania programu nie przebiega automatycznie utworzymy zatem przycisk dodający kolejną kolumnę do DataGridView1, patrz kod poniżej. Więcej poleceń obsługujących obiekt DataGridView umieściłem w pliku: 01_gridview_skrot.pdf, https://www.simr.pw.edu.pl/~jbo/vb/vb_pracownia2013/01_gridview_skrot.pdf a skrót informacji o działaniach na tablicach w pliku: vb6.00_tablice_wstep.pdf https://www.simr.pw.edu.pl/~jbo/vb/vb_express2008/vb6.00_tablice_wstep.pdf. Z aplikacją będziemy pracować w następujący sposób. Przyciskiem [Grid do tabeli] będziemy zawartość komórek DataGridView1 umieszczać w tabeli(,). Odpowiednie działania będziemy wykonywali na tej właśnie tabeli i jeśli wynik będzie tego wymagał przetworzoną tabelę będziemy wyświetlać przyciskiem [Tabela do gridu] w obiekcie wyjściowym DataGridView2. Aby uprościć dostęp do tabeli ze wszystkich procedur zadeklarujemy ją: (1) poza procedurami, (2) w sposób dynamiczny. Ad 2: Dlaczego dynamicznie? Program, podczas działania, musi wiedzieć jaki jest rozmiar tabeli. Nie wiadomo jednak ile wierszy i ile kolumn kolejny użytkownik aplikacji będzie potrzebował. Zadeklarujemy zatem tabelę dynamicznie tzn, że będzie ona raz większa, a raz mniejsza, w zależności od potrzeb. Deklarację dynamiczną wykonamy w 4 krokach: 1. Deklaracja poza wszystkimi procedurami bez wskazywania wartości wymiarów tabeli: Public Class Form1 Dim tabela(,) As Single Dim Nwierszy, Nkolumn As Integer Jest to tabela o dwóch wymiarach (rozpoznajemy to po przecinku) ale nie znamy ich rozmiarów. 2. Sprawdzenie ile wierszy i ile kolumn ma mieć tabela (Uwaga. Elementy w tabeli numerujemy od zera. Oznacza to, że tabela posiadająca 5 wierszy i 10 kolumn powinna być zadeklarowana jako tabela(4, 9)). 'Odczytaj liczbę wierszy. Uwaga: licząc pierwszy wiersz (nagłówkowy) jako 1 LiczbaWierszyGridu = DataGridView1.RowCount Jeśli wypełnimy 4 wiersze w DatagridView1 uzyskamy LiczbaWierszyGridu = 5, bo policzony zostanie także wiersz nagłówka. Rozmiar wierszy tabeli Nwierszy będzie zatem: Nwierszy = LiczbaWierszyGridu 2 '(-1) bo w tabeli liczymy wiersze od 0 'i jeszcze (-1) bo był wiersz nagłówkowy, razem (-2). Dalej podobne działania wykonamy dla kolumn LiczbaKolumnGridu = DataGridView1.ColumnCount Nkolumn = LiczbaKolumnGridu 1 'bo w tabeli liczymy kolumny od 0 3. Deklaracja tablicy już z rozmiarami (ale UWAGA! Już bez wskazywania typu). ReDim tabela(nwierszy, Nkolumn) 4. Zapełnianie tablicy tabela(i, j) = CSng(DataGridView1.Item(j, i).value) ' Uwaga i,j a w Gridzie odwrotnie j, i Copyright 2017, mgr inż. Janusz Bonarowski 1
Pełny kod procedury przekładania wartości z DataGridView1 do tabeli Private Sub ButtonGridDoTabeli_Click(sender As Object, e As EventArgs) _ Handles ButtonGridDoTabeli.Click 'Przepisanie wartości z DatagridView do tabeli --------- Dim LiczbaWierszyGridu, LiczbaKolumnGridu As Integer LiczbaWierszyGridu = DataGridView1.RowCount Nwierszy = LiczbaWierszyGridu - 2 'bo liczymy wiersze od 0 LiczbaKolumnGridu = DataGridView1.ColumnCount Nkolumn = LiczbaKolumnGridu - 1 ReDim tabela(nwierszy, Nkolumn) tabela(i, j) = CSng(DataGridView1.Item(j, i).value) ' ---- **** MsgBox("Dane przeniesiono do tabeli") Przekładanie wartości z tabeli do DataGridView2 Private Sub ButtonTabelaDoGridu_Click(sender As Object, e As EventArgs) _ Handles ButtonTabelaDoGridu.Click 'Przepisanie danych z tabeli do DataGridView2 --------- ' Usunięcie wierszy DataGridView2.Rows.Clear() ' Dodanie wierszy do DatagridView2 DataGridView2.Rows.Add() ' Przełożenie wartości z tabeli do gridu DataGridView2.Item(j, i).value = tabela(i, j) 'DataGridView2.Item(j, i).value = Format(R(i, j), "0.0") Mnożenie każdego elementu tabeli przez 10 Private Sub ButtonElementyX10_Click(sender As Object, e As EventArgs) _ Handles ButtonElementyX10.Click 'Pomnożenie każdego elementu przez 10 tabela(i, j) = tabela(i, j) * 10 MsgBox("Mnożenie wykonane") Copyright 2017, mgr inż. Janusz Bonarowski 2
Pełny kod aplikacji Rysunek 1 Dim tabela(,) As Single Dim Nwierszy, Nkolumn As Integer 'Rozmiary tabeli Private Sub ButtonDodajKolumne_Click(sender As Object, e As EventArgs) Handles ButtonDodajKolumne.Click ' Dodanie kolumny do DataGridView1 o szerokości 50. ' ---------------------------------------------------- Dim NrKolumny As Integer NrKolumny = DataGridView1.ColumnCount DataGridView1.Columns.Add("Column" & (NrKolumny + 1), "Column" & (NrKolumny + 1)) DataGridView1.Columns(NrKolumny).Width = 50 DataGridView2.Columns.Add("Column" & (NrKolumny + 1), "Column" & (NrKolumny + 1)) DataGridView2.Columns(NrKolumny).Width = 50 Private Sub ButtonUsunKolumne_Click(sender As Object, e As EventArgs) Handles ButtonUsunKolumne.Click ' Usuwanie ostatniej kolumny ' -------------------------- Dim NrKolumny As Integer NrKolumny = DataGridView1.ColumnCount 'MsgBox(NrKolumny) DataGridView1.Columns.RemoveAt(NrKolumny - 1) DataGridView2.Columns.RemoveAt(NrKolumny - 1) Copyright 2017, mgr inż. Janusz Bonarowski 3
Private Sub ButtonGridDoTabeli_Click(sender As Object, e As EventArgs) Handles ButtonGridDoTabeli.Click ' Przepisanie wartości z DataGridView1 do tabeli ' --------------------------------------------- Dim LiczbaWierszyGridu, LiczbaKolumnGridu As Integer ' Odczytaj liczbę wierszy ' Uwaga: licząc pierwszy wiersz (nagłówkowy) jako 1 LiczbaWierszyGridu = DataGridView1.RowCount Nwierszy = LiczbaWierszyGridu 2 bo liczymy wiersze od 0 ' Odczytaj liczbę kolumn Uwaga: licząc pierwsza kolumnę jako 1 LiczbaKolumnGridu = DataGridView1.ColumnCount Nkolumn = LiczbaKolumnGridu 1 Ponowna, dynamiczna deklaracja tabeli (bez typu) ReDim tabela(nwierszy, Nkolumn) ' Zapełnianie tabeli z gridu. ' Uwaga. Do tabeli odwołujemy się tabela(wiersz, kolumna) ' do gridu odwołujemy się DataGridView(kolumna, wiersz) tabela(i, j) = CSng(DataGridView1.Item(j, I).Value) ' **** **** LabelUwaga.Text = "" MsgBox("Dane przeniesiono do tabeli") Private Sub ButtonTabelaDoGridu_Click(sender As Object, e As EventArgs) Handles ButtonTabelaDoGridu.Click ' Przepisanie danych z tabeli do DataGridView2 ' --------------------------------------------- ' (1) Usunięcie wszystkich wierszy (oprócz edycyjnego) DataGridView2.Rows.Clear() ' (2) Dodanie wierszy do DatagridView2 DataGridView2.Rows.Add() ' (3) Przełożenie wartości z tabeli do gridu DataGridView2.Item(j, i).value = tabela(i, j) 'DataGridView2.Item(j, i).value = Format(tabela(i, j), "0.0") Private Sub ButtonElementyX10_Click(sender As Object, e As EventArgs) Handles ButtonElementyX10.Click 'Pomnożenie każdego elementu przez 10 tabela(i, j) = tabela(i, j) * 10 MsgBox("Mnożenie wykonane, przepisz tabelę do Grid2") Copyright 2017, mgr inż. Janusz Bonarowski 4
Private Sub ButtonSumaGlownaprzekatna_Click(sender As Object, e As EventArgs) Handles ButtonSumaGlownaprzekatna.Click 'Suma elementów na głównej przekątnej suma = 0 suma = suma + tabela(i, i) TextBoxSumaNaGlownej.Text = CStr(suma) Private Sub ButtonSumaNaDrugiejPrzekatnej_Click(sender As Object, e As EventArgs) Handles ButtonSumaNaDrugiejPrzekatnej.Click 'Suma elementów na drugiej przekątnej suma = suma + tabela(i, Nkolumn - i) TextBoxSumaNaDrugiej.Text = CStr(suma) Private Sub ButtonSumaWkolumnie_Click(sender As Object, e As EventArgs) Handles ButtonSumaWkolumnie.Click ' Suma elementów we wskazanej kolumnie. ' ------------------------------------- ' nrkolumny - liczone od 1 Dim nrkolumny As Integer nrkolumny = CInt(TextBoxNrKolumny.Text) suma = 0 suma = suma + tabela(i, nrkolumny - 1) TextBoxSumaWkolumnie.Text = CStr(suma) Private Sub ButtonNajwiekszyElement_Click(sender As Object, e As EventArgs) Handles ButtonNajwiekszyElement.Click ' Największy element w DatagridView1 ' ---------------------------------- Dim najwiekszy As Single Dim iw, ik As Integer 'indeksy w Gridzie ' (1) Zakładamy, że tabela(0,0) to max najwiekszy = tabela(0, 0) iw = 0 ik = 0 If najwiekszy < tabela(i, j) Then najwiekszy = tabela(i, j) iw = i ik = j End If TextBoxMax.Text = CStr(najwiekszy) TextBoxIndeksy.Text = "Grid(" & (iw + 1) & ", " & (ik + 1) & ")" Copyright 2017, mgr inż. Janusz Bonarowski 5
Private Sub ButtonSumaPodGlowna_Click(sender As Object, e As EventArgs) Handles ButtonSumaPodGlowna.Click ' Suma pod główną przekątną ' ------------------------- If i > j Then suma = suma + tabela(i, j) End If TextBoxSumaPodGlowna.Text = CStr(suma) Private Sub ButtonSumaPodDruga_Click(sender As Object, e As EventArgs) Handles ButtonSumaPodDruga.Click ' Suma elementów pod drugą przekątną ' ---------------------------------- For j = Nkolumn To Nkolumn - i + 1 Step -1 'MsgBox("tabela(" & i & "," & j & ")=" & tabela(i, j)) suma = suma + tabela(i, j) TextBoxSumaPodDruga.Text = CStr(suma) Private Sub ButtonSumaDodatnich_Click(sender As Object, e As EventArgs) Handles ButtonSumaDodatnich.Click ' Suma wszystkich elementów dodatnich ' ----------------------------------- If tabela(i, j) > 0 Then suma = suma + tabela(i, j) End If TextBoxSumaDodatnich.Text = CStr(suma) Private Sub DataGridView1_CellValueChanged (sender As Object, e As DataGridViewCellEventArgs) Handles DataGridView1.CellValueChanged ' Przypomnienie o przepisaniu do tabeli ' ------------------------------------- LabelUwaga.Text = "Pamiętaj o przepisaniu danych do tabeli!" Copyright 2017, mgr inż. Janusz Bonarowski 6