Programowanie w MS Visual Studio 2005 z wykorzystaniem MS SQL Server 2005 Lekcja 3 Zapisywanie i anulowanie zmian wprowadzonych w DataGridView do pliku z Bazą Danych. Formatowanie DataGridView. Wymagania: Wymagania z poprzednich lekcji Projekt z lekcji 2 15 minut wolnego czasu 1. Edycja, usuwanie i dodawanie danych w DataGridView: Jak już pewnie zauważyliście wprowadzanie zmian jest intuicyjne-po prostu klikamy na pole,które chcemy modyfikowad i zmieniamy jego wartośd. Z usuwaniem też nie ma kłopotu - zaznaczamy krotkę do usunięcia i przycisk delete kasuje to co zaznaczyliśmy. Natomiast, aby dodad nowy wiersz musimy zejśd na sam dół naszej tabeli i w ostatnim wierszu(który powinien byd pusty) wpisujemy dane które chcemy dodad. Czasem jednak chcielibyśmy by któraś z tych funkcji była niedostępna np. nie można było by dodawad nowych wpisów robi się to następująco: Wchodzimy do widoku [Design] formularza i klikamy na DataGridView Ustawiamy we właściwościach ograniczenia: A) AllowUserToAddRows zabronienie/zezwolenie na dodawanie wierszy B) AllowUserToDeleteRows zabronienie/zezwolenie na usuwanie wierszy C) EditMode w zależności od ustawienia określa sposób edycji lub go zabrania z poziomu aplikacji D) ReadOnly - zabronienie/zezwolenie na dodawanie, usuwanie i edycje
Chod zmiany, które wprowadzamy są widoczne na naszej formatce to nie są one wprowadzane do naszej bazy danych. Teraz właśnie tym się zajmiemy: 2. Edycja, usuwanie i dodawanie danych w Bazie Danych: By zatwierdzad zmiany w BD należy jeszcze ustawid jak powinna zachowywad się nasza baza podczas operacji kasowania i usuwania kluczy. Do wyboru mamy opcje: a) kaskadową polegającą na wprowadzeniu zmian we wszystkich tabelach, które są w relacji z kasowaną krotką b) wstawienie null jak nazwa wskazuje wstawia w tabelach null w miejsce skasowanej krotki c) bez akcji nie zmienia nic w powiązanych tabelach
d) ustaw Domyślne wstawia wartośd domyślną do tabel powiązanych ( bardziej szczegółowy opis tych opcji czytelnik może znaleźd w książkach związanych z Bazami Danych polecam Podstawowy wykład z systemów baz danych J. D. Ullman i J. Widom) By znaleźd tę opcję należy: a) wejśd do Diagramu naszej bazy b) kliknąd na relacje którą chcemy zmienid c) w polu Propeties zmieniad odpowiednio Insert and Update Specif -> Delete Rule lub Update Rule Teraz możemy przejśd do głównej części programowanie: Na początek dodajmy na formatkę nowy przycisk, który będzie wykonywał zapis zmian w naszej bazie. Nazwijmy go ZapiszZM i klikając na niego utwórzmy event click i wpiszmy tam następujący kod:
//UWAGA!!!!! // zmienną DataAdapter z metody DataGridFill() należy zrobić zmienną globalną // inaczej nie będziemy mieli dostepnu do adaptera naszej bazy i przez to nie będziemy w // w stanie wykonać aktualizaji naszej bazy try // tworzymy obiekt ktory wykona za nas cala "brudna robote" i stworzy zapytanie zalezne //od naszej edycji // jesli usuwalismy to zapytanie DELATE, edycji - UPDATE etc. SqlCommandBuilder objcommandbuilder = new SqlCommandBuilder(DataAdapter); // aktualizujemy naszą bazę metodą update naszego DataAdaptera //z parametrami - datasetem ktory jest fizyczą kopią bazy w programie //i nazwa tabeli jaka modyfikowaliśmy. DataAdapter.Update(dataSet1, "show"); // Komunikat o poprawnym zakonczeniu zadania MessageBox.Show("Zapisano"); catch (Exception p) // łapiemy ewentualne błedy MessageBox.Show("Wyjątek : "+ p.message + "\n Zmiany nie zostały zapisane!"); Teraz, gdy wprowadzimy zmiany w tabeli i klikniemy dodany przed chwilą przycisk, zmiany zostaną zapisane w pliku mdf( jeśli nie możesz dodawad, edytowad lub usuwad pól zobacz czy nie ustawiłeś ograniczeo we właściwościach DataGridView). W zależności, jakie ustawiliśmy kasowanie, edycje i wstawienie(cascade, set null czy no action) w naszej bazie taka zmiana wykona się nie tylko w wyświetlonej tabeli, ale w całej bazie!!!!uwaga!!! - > przykład na którym pracujemy jest bardzo prosty i dzięki temu możemy korzystad z ułatwienia jakim jest SqlCommandBuilder, niestety w bardziej skomplikowanych Bazach Danych musimy ręcznie wykonywad operacje INSERT, UPDATE i DELETE. Można to zrobid w następujący sposób dla UPDATE tabeli pracownik: for (int i = 0; i < dataset1.getchanges(datarowstate.modified).tables["show"].rows.count; i++) // pobieramy imie z modifikowanej i-tej krotki string imie= dataset1.getchanges(datarowstate.added).tables["show"].rows[i].cell s[1].value.tostring().trim(); // pobieramy nazwsiko z modifikowanej i-tej krotki string nazwisko= dataset1.getchanges(datarowstate.added).tables["show"].rows[i].cell s[2].value.tostring().trim(); // pobieramy id z modifikowanej i-tej krotki string id = dataset1.getchanges(datarowstate.added).tables["show"].rows[i].cell s[0].value.tostring().trim(); // tworzymy komende w SQL-u string sqlcommand = "UPDATE pracownik SET Imie='" + imie + "', Nazwisko='" + nazwisko + "' WHERE ID=" + id; SqlCommand Command = new SqlCommand(sqlCommand, connection); // ustawiamy jej Timeout np na 3 sekundy Command.CommandTimeout = 3; // wykonjujemy komende Command.ExecuteNonQuery();
Czasem jednak, gdy wprowadzimy złe dane, a nie pamiętamy, co zawierały zastąpione dane chcielibyśmy wrócid do stanu sprzed edycji- nic prostszego( nie chodzi mi o wyłączenie i włączenie jeszcze raz naszego programu bez zapisywania danych :-P)! 3. Anulowanie zmian: Dodajmy kolejny przycisk na formatce i utwórzmy event click Wpiszmy następujący kod: try // odwolujemy zmiany ds.rejectchanges(); catch (Exception z) // łapiemy ewentualny błąd MessageBox.Show(" Pewnie twoj :-P \n" + z.message, "BLAD"); Gotowe! Teraz nie grozi nam już mozolne włączanie i wyłączanie programu, gdy popełnimy błąd 4. Formatowanie DataGridView: Do tej pory nasza Formatka po wgraniu bazy powinna wyglądad mniej więcej tak: Jeśli ją zmaksymalizujemy okaże się, że nasz DataGridView nie zachowuje się tak jakbyśmy tego chcieli i nie powiększa się wraz z oknem tylko zostaje w takim samym rozmiarze, jaki mu daliśmy pierwotnie- nie wygląda to
elegancko. Postarajmy się cos z tym zrobid. Przechodząc do widoku *Design+ i wchodząc we właściwości naszego DataGridView bez problemu znajdziemy opcje Anchor zmieomy jej wartośd na Top, Bottom, Left, Right- dzięki temu zakotwiczyliśmy nasze narzędzie i będzie ono zawsze w takich samych proporcjach niezależnie od rozmiaru, jaki ustawi użytkownik(polecam zmienid analogiczną opcję dla pozostałych narzędzi na formatce, chod z inną wartością wszystko zależy od koncepcji)! Zmieniając opcję AutoSizeCollumnsMode na Fill spowodujemy, że wyświetlona tabelka będzie zajmowad całe szare tło co na pewno wygląda estetyczniej. Polecam dalsze eksperymentowanie z innymi opcjami narzędzia DataGridView, aż do osiągnięcia satysfakcjonującego nas wyglądu