Programowanie w MS Visual Studio 2005 z wykorzystaniem MS

Transkrypt

Programowanie w MS Visual Studio 2005 z wykorzystaniem MS
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 

Podobne dokumenty