Za potrebe auto placa kreirana je baza podataka u kojoj se vodi evidencija o svim vozilima.
Dijagram za postojeću bazu dat je na slici:

slika baze za B1 zadatak sa Maturskog 2021

SQL Query za kreiranje i popunjavanje baze u MS SQL Serveru: ( LINK->Preuzmi fajl, levi klik- Save Link As...)

ili, ako ste za druge formate, možete preuzeti: Access ACCDB bazu, ili Access MDB bazu ili upit koji pokrećete na MySql-u nakon kreiranja baze B31 (LINK - preuzmi upit, levi klik- Save Link As...)

Zadatak:

Kreirati desktop aplikaciju koja će omogućiti rad sa postojećom bazom.

Unošenje podataka o gorivu obavlja se preko obrasca čiji je izgled dat na slici nastavku:

zadata slika

  • U okviru sa listom prikazuju se podaci o gorivu sortirani po šifri u rastući niz.
  • Ukoliko gorivo sa unetom šifrom postoji prikazuju se podaci o njemu.
  • Obezbediti da korisnik dobije poruku o uspešnom upisu/brisanju/izmeni podataka, kao i o obrađenim greškama.

Uputstvo za rad:

  • Prvo postaviti komponente: 3x TextBox, 4x Button, 6x Label, 1x ListBox
  • Zatim isprogramirati dugme za izlaz: Application.Exit();
  • Dvoklikom na formu, isprogramirati da se prilikom učitavanja forme popuni ListBox1 sa podacima iz tabele.

Savet: Ovo uraditi u posebnoj metodi koja se onda poziva iz Form1.Load().

Prvo treba da se prilikom inicijalizacije komponenti, u konstruktoru, podese tab stopovi za List box.

Klik na dugme ispod da vidite primer kako se to može uraditi:



            listBox1.UseCustomTabOffsets = true;
            listBox1.CustomTabOffsets.Clear();
            listBox1.CustomTabOffsets.Add(20);
            listBox1.CustomTabOffsets.Add(95);
                     

Drugi način:

            listBox1.UseCustomTabOffsets = true;
listBox1.CustomTabOffsets.Clear();
int[] razmak = { 80, 180 };
listBox1.CustomTabOffsets.AddRange(razmak);

Objašnjenje:

  1. postavlja se da su razmaci (tab) Custom - da ih sami podešavamo a da se ne oslanjamo na podrazumevane vrednosti
  2. Uklanjamo podrazumevane vrednosti za razmake
  3. uvodimo niz celih brojeva u koji smeštamo koliko piksela je za koji razmak
  4. taj niz ubacujemo  kao CustomTabOffsets !

Zatim napraviti metodu UnesiListu() koja će se pozivati svaki put kada treba uneti listu sa podacima:


void UnesiListu()
   {
       listBox1.Items.Clear();
       ***Connection konekcija = new ***Connection(konSTR);
       string Upit = "SELECT GorivoID, Naziv, Opis FROM Gorivo ORDER BY GorivoID";
       try
       {
           konekcija.Open();
           ***Command komanda = new ***Command(Upit, konekcija);
           ***DataReader rd = komanda.ExecuteReader();
           while (rd.Read())
{ listBox1.Items.Add(rd[0] + "\t" + rd[1] + "\t" + rd[2]);
} } catch (Exception a) { MessageBox.Show("Greška \n " + a.Message); }
finally
{
konekcija.Close();
} }

***

  • Kada se unese šifra, treba da se označi gorivo sa tom šifrom u ListBox-u, a ako ne postoji, onda se ne označava:

 // kako ovo uraditi? - ovo samo ako stignemo na času ....

  • Kada se klikne na ListBox i odabere jedna stavka, treba da se popune odgovarajući textBox-ovi podacima iz označenog reda


      private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
    {
    string ceoRed = listBox1.Text;
    string[] nizReci = ceoRed.Split('\t');
    tbSifra.Text = nizReci[0];
    tbNaziv.Text = nizReci[1];
    tbOpis.Text = nizReci[2];
    }
  • Klikom na dugme "Obriši" treba da se izabrano gorivo obriše iz tabele (i iz baze)

Obratite pažnju da se prilikom brisanja goriva, treba ili obrisati sva vozila koja koriste to gorivo, ili im postaviti da koriste drugo gorivo. Brisanje neće biti moguće ako postoji neko vozilo koje je ostalo da koristi to gorivo. zbog referencijalnog integriteta - GorivoID je strani ključ u tabeli vozilo!



***Connection konekcija = new ***Connection(konSTR);
string upit1 = "DELETE FROM Gorivo WHERE GorivoID = @sifra1 ";

string sifra = tb_sifra.Text;
try
{
    konekcija.Open();
    ***Command komanda1 = new ***Command(upit1, konekcija);
 
    komanda1.Parameters.AddWithValue("@sifra1", sifra);
   
    komanda1.ExecuteNonQuery();
    MessageBox.Show("Uspesno obrisano");

    UnesiListu();
    
 }
catch (Exception a)
{
    MessageBox.Show(a.Message);
}
finally
{
konekcija.Close();
}
  • Klikom na dugme "Izmeni" treba da se izmene podaci o izabranom gorivu

// kako ovo uraditi? - Slično kao i za brisanje, samo što je upit drugačiji:

UPDATE Gorivo SET Naziv=@ime, Opis=@info WHERE GorivoID=@id

i treba da se komandi proslede tri parametra !

  • Klikom na dugme "Upiši" treba da se upiše novi red u tabelu o gorivu
// kako ovo uraditi? - Slično kao i za prethodna dva slučaja, samo što je upit drugačiji:
 INSERT INTO Gorivo (GorivoID, Naziv, Opis) VALUES (@id, @ime, @info)

i treba da se komandi proslede tri parametra :



***Connection konekcija = new ***Connection(konSTR);
string upit = "insert into gorivo(GorivoID,Naziv,Opis) values(@id,@ime,@info)";

string sifra = tb_sifra.Text;
string naziv = tb_naziv.Text;
string opis = tb_opis.Text;

try
{
    konekcija.Open();
    ***Command komanda = new ***Command(upit, konekcija);
    komanda.Parameters.AddWithValue("@id", sifra);
    komanda.Parameters.AddWithValue("@ime", naziv);
    komanda.Parameters.AddWithValue("@info", opis);
    komanda.ExecuteNonQuery();
    MessageBox.Show("Uspesno upisano");
   
    UnesiListu();
}
catch (Exception a)
{
    MessageBox.Show(a.Message);
}
finally {
konekcija.Close();
}



Na času vežbi u učionici, korišćena je varijanta sa MS SQL Serverom. U nastavku se nalaze delovi koda iz rešenja sa časa, iz Form1.cs.

//

using System.Data.SqlClient;

//

private void btnIzlaz_Click(object sender, EventArgs e)
{
this.Close();
}

//

void popuniListBox()
{
listBox1.Items.Clear();

string konekcioniString = "Data Source=.;Initial Catalog=B31_Auto_plac;Integrated Security=True";
SqlConnection konekcija = new SqlConnection(konekcioniString);
SqlCommand komanda = new SqlCommand("SELECT GorivoID, Naziv, Opis FROM Gorivo ORDER BY GorivoID", konekcija);

try
{
konekcija.Open();
SqlDataReader rd = komanda.ExecuteReader();
while (rd.Read())
{
listBox1.Items.Add(rd[0] + "\t" + rd[1] + "\t" + rd[2]);
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
finally
{
konekcija.Close();
}
}

//

private void Form1_Load(object sender, EventArgs e)
{
listBox1.UseCustomTabOffsets = true;
listBox1.CustomTabOffsets.Clear();
int[] razmaci = { 20, 100 };
listBox1.CustomTabOffsets.AddRange(razmaci);

popuniListBox();
}

//

private void listBox1_SelectedIndexChanged(object sender, EventArgs e)
{
string red = listBox1.Text;
string [] reci = red.Split('\t');

textBox1.Text = reci[0];
textBox2.Text = reci[1];
textBox3.Text = reci[2];
}

//

private void btnIzmena_Click(object sender, EventArgs e)
{
string id = textBox1.Text;
string nazivGoriva = textBox2.Text;
string opisGoriva = textBox3.Text;

string upit = "UPDATE Gorivo SET Naziv='"+nazivGoriva+"', Opis='"+opisGoriva+"' WHERE GorivoID="+id;

string konekcioniString = "Data Source=.;Initial Catalog=B31_Auto_plac;Integrated Security=True";
SqlConnection konekcija = new SqlConnection(konekcioniString);
SqlCommand komanda = new SqlCommand(upit, konekcija);

try
{
konekcija.Open();
komanda.ExecuteNonQuery();
popuniListBox(); // osvežiti sadržaj listBoxa
MessageBox.Show("uspešno izvršena IZMENA");
}
catch (Exception xx)
{
MessageBox.Show(xx.Message);
}
finally
{
konekcija.Close();
}
}

//

private void btnBrisanje_Click(object sender, EventArgs e)
{
string id = textBox1.Text;

string konekcioniString = "Data Source=.;Initial Catalog=B31_Auto_plac;Integrated Security=True";
SqlConnection konekcija = new SqlConnection(konekcioniString);

string upit = "DELETE FROM Gorivo WHERE GorivoID="+id;

SqlCommand komanda = new SqlCommand(upit,konekcija);

try
{
konekcija.Open();
komanda.ExecuteNonQuery();
popuniListBox();
MessageBox.Show("uspešno izvešeno BRISANJE");
}
catch (Exception ddd)
{
MessageBox.Show(ddd.Message);
}
finally
{
konekcija.Close();
}
}

//

private void btnUpis_Click(object sender, EventArgs e)
{
string id = textBox1.Text;
string nazivGoriva = textBox2.Text;
string opisGoriva = textBox3.Text;

string konekcioniString = "Data Source=.;Initial Catalog=B31_Auto_plac;Integrated Security=True";
SqlConnection konekcija = new SqlConnection(konekcioniString);

string upit = "INSERT INTO Gorivo(GorivoID,Naziv,Opis) VALUES ("+id+",'"+ nazivGoriva+"','"+opisGoriva+"')";

SqlCommand komanda = new SqlCommand(upit, konekcija);

try
{
konekcija.Open();
komanda.ExecuteNonQuery();
popuniListBox();
MessageBox.Show("uspešno izvršen UPIS");
}
catch (Exception q)
{
MessageBox.Show(q.Message);
}
finally {
konekcija.Close();
}
}

//

private void textBox1_TextChanged(object sender, EventArgs e)
{
string id = textBox1.Text;
int indeks = listBox1.FindString(id);
if (indeks != -1) listBox1.SelectedIndex = indeks;
}
// ovo nije najbolje rešenje, a vi razmislite o tome
Poslednja izmena: четвртак, 11. децембар 2025, 13:03