Sunteți pe pagina 1din 4

TEHNICI DE PROGRAMARE AVANSATA – CURS 3

1. Implementarea unui model simplu de vizualizare/actualizare date dintr-o tabela


Modelul prezentat in continuare este un model simplu de vizualizare/actualizare tabela, ce
functioneaza in urmatoarele conditii:
1. Actualizarea se face direct in grid;
2. Restrictiile de integritare (duplicat pe cheie semantica, stergere entitate referita in alta
tabela) trebuiesc implementate la nivelul bazi de date.
3. Tabela nu are chei externe, decI legaturi cu alte tabele.

Pas 1. Se structureaza form-ul dupa modelul urmator:

Butoanele au urmatoarele proprietati:


Name -> btnActualizare; Text -> Actualizare
Name -> btnRenuntare; Text -> Renuntare
Name -> btnSalvare; Text -> Salvare

Pas 2. Logica de functionare este data de diagrama de stari:

Click btnActualizare / A2

/A1
Vizualizare Actualizare

Click btnRenuntare / A3

Click btnSalvare / A4

A1 - grid-ul nu permite actualizari; btnActualizare disponibil;


btnRenuntare si btnSalvare invizibile; incarcare dataTable
A2 - btnActualizare indisponibil; grid permite actualizari;
btnRenuntare, btnSalvare vizibile
A3 - grid-ul nu permite actualizari; btnActualizare disponibil;
btnRenuntare si btnSalvare invizibile; incarcare dataTable
A4 - update baza de date;
grid-ul nu permite actualizari; btnActualizare disponibil;
btnRenuntare si btnSalvare invizibile; incarcare dataTable
Observam o secventa comuna intre A1, A3 si A4. Sa notam cu Aviz aceasta secventa.
Actiunile A1, A2, A3, A4 si Aviz:
AViz - grid-ul nu permite actualizari; btnActualizare disponibil;
btnRenuntare si btnSalvare invizibile; incarcare dataTable
A1 - AViz.
A2 - ramane nemodificata:
btnActualizare indisponibil; grid permite actualizari;
btnRenuntare, btnSalvare vizibile
A3 - AViz
A4 - update baza de date; Aviz
Pas 3. In modulul de cod asociat form-ului (click dr pe spatiul liber al form-ului =>
View code sau F7); se creaza o metoda AViz cu urmatorul continut:
private void AViz()
{
//Grid-ul nu permite actualizari

dataGridView1.AllowUserToAddRows = false;
dataGridView1.AllowUserToDeleteRows = false;
dataGridView1.ReadOnly = true;

//btnActualizare disponibil

btnActualizare.Enabled = true;

//btnSalvare si btnRenuntare invizibile

btnSalvare.Visible = false;
btnRenuntare.Visible = false;

// Incarcare DataTable Parteneri


tabelaTableAdapter.Fill(dataSet1.Tabela);
}

Pas 4. Metoda eveniment Form1_Load devine:


private void Form1_Load(object sender, EventArgs e)
{
AViz();
}

Pas 5. Se creaza 3 proceduri eveniment corespunzatoare evenimentului


Click pt. cele 3 butoane (dbl Click pe fiecare buton). Se completeaza cu urmatorul cod:
private void btnActualizare_Click(object sender, EventArgs e)
{
//Grid-ul permite actualizari
dataGridView1.AllowUserToAddRows = true;
dataGridView1.AllowUserToDeleteRows = true;
dataGridView1.ReadOnly = false;

//btnActualizare indisponibil
btnActualizare.Enabled = false;

//btnSalvare si btnRenuntare vizibile


btnSalvare.Visible = true;
btnRenuntare.Visible = true;
}
private void btnSalvare_Click(object sender, EventArgs e)
{
tabelaTableAdapter.Update(dataSet1.Tabela);
AViz();
}

private void btnRenuntare_Click(object sender, EventArgs e)


{
AViz();
}

OBS. tabela reprezinta numele lui DataTable scris cu initiala litera mica
(de exemplu persoane) iar Tabela reprezinta acelasi nume scris cu initiala
majuscula (de ex. Persoane)

Pas 6. Tratarea erorilor de tip format eronat pentru date calendaristice si date numerice.
Se creaza metoda de tratare a evenimentului DataError pentru controlul grid .
Se completeaza codul astfel:

private void dataGridView1_DataError(object sender,


DataGridViewDataErrorEventArgs e)
{
MessageBox.Show("Format eronat");
}

Pas 7. Tratarea erorilor de tip


- Duplicat pe cheie semantica si
- Stergere inregistrare referita din alta tabela
Se inlocuieste corpul metodei btnSalvare_Click cu:

private void btnSalvare_Click(object sender, EventArgs e)


{
try
{
tabelaTableAdapter.Update(dataSet1.Tabela);
AViz();
}
catch (Exception exc) {
string s = exc.Message;
//MessageBox.Show(s);
if (s.IndexOf("duplicate values") > 0)
MessageBox.Show("Inregistrare deja existenta !");
else if (s.IndexOf("cannot be deleted") > 0)
MessageBox.Show("Ati sters inregistrari referite in alte
tabele !");
}
}

Pas 8. Confirmarea stergerii

private void dataGridView1_UserDeletingRow(object sender, DataGridViewRowCancelEventArgs e)


{
const string mesaj = "Confirmati stergerea";
const string titlu = "Stergere inregistrare";
var rezultat = MessageBox.Show(mesaj, titlu,
MessageBoxButtons.YesNo,
MessageBoxIcon.Warning );
if (rezultat == DialogResult.No) e.Cancel = true;
}