• Rezultati Niso Bili Najdeni

Gradniki projekta DataGridViewDemo

In document Načrtovanje programskih (Strani 97-105)

Gradnik DataGridView

Slika 56: Gradniki projekta DataGridViewDemo

V mapo Bin→Debug našega projekta skopirajmo tri slike naših vrhov, nato pa v konstruktorju obrazca poskrbimo, da bo na začetku v gradniku že nekaj vrstic podatkov. Stavki, zapisani v konstruktorju, se bodo namreč izvedli ob ustvarjanju obrazca, preden se bo ta prvič prikazal.

Posamezno vrstico dodamo s pomočjo metode Rows.Add(), ki ima toliko parametrov, kot je stolpcev v tabeli.

//dodajanje nove vrstice v gradnik DataGridView

dGVTransverzala.Rows.Add("Triglav", 2863, true, "Julijske Alpe", slika,

"http://sl.wikipedia.org/wiki/Triglav");

Če se bo uporabnik odločil za urejanje oz. dodajanje novih zapisov, bo viden le panel z gradniki za vnos oz. ažuriranje podatkov izbrane vrstice gradnika DataGridView. Skrivanje in prikazovanje panela ter gradnika DataGridView najlaže dosežemo z metodama BringToFront() in SendToBack() teh dveh gradnikov (a le v primeru, da smo gradnikoma nastavili lastnost Dock).

Dodajmo še osnovne metode za delo z gradnikom DataGridView (dodajanje, dostop do izbrane vrstice in celice, obdelava vseh vrstic, brisanje). Novo vrstico dodamo s pomočjo metode Rows.Add(), vsebino izbane celice tekoče vrstice pa dobimo preko objekta CurrentRow.Cells[ime].Value (ime je tukaj ime stolpca, namesto imena stolpca pa lahko zapišemo tudi njegov indeks).

TextBox (tBIme,tBSplet) ComboBox (cBSkupina) NumericUpDown (nUDVisina) CheckBox (cBTransverzala)

Button (bIsciSliko)

PictureBox (pBSlika) Button (bShrani, bPreklici)

Panel(panel2)

GroupBox (groupBox1)

DataGridView(dGVTran sverzala)

Panel(panel1) Button (bDodaj, BObdelava, bBrisi)

Razložimo še dogodka, s katerima lahko kontroliramo uporabnikove vnose in se tem zavarujemo pred napačnimi vnosi podatkov. To sta dogodka CellValidating in CellEndEdit.

Namen metode CellValidating je zagotoviti, da bo uporabnik v določeno polje vnesel neko veljavno vrednost, npr. nenegativno celo število. Drugi parameter te metode, parameter e, je objekt tipa DataGridViewCellValidatingEventArgs. Ta objekt pozna tudi lastnost, s katero lahko ugotovimo, katera celica je bila ažurirana: e.ColumnIndex vsebuje številko stolpca, e.RowIndex pa številko vrstice. Pri tem upoštevamo, da imata prva vrstica in prvi stolpec indeks enak 0.

Pri obdelavi dogodka CellValidating lahko uporabimo metodo int.TryParse, ki je zelo koristna v primerih preverjanja, ali lahko nek niz pretvorimo v celo število. Metoda vrne True, če je pretvarjanje uspešno, obenem pa v svoj drugi parameter ( v našem primeru zacasna), ki je klican po referenci, zapiše pretvorjeno vrednost. Če je pretvarjanje neuspešno (uporabnik je vnesel npr. niz, ki vsebuje črke, ali pa je vnesena vrednost negativna), se v lastnost ErrorText trenutne vrstice v tabeli zapiše ustrezno obvestilo o napaki. Na začetku te vrstice se prikaže ikona s klicajem. Če na ikono postavimo kazalnik miške, se pod njo izpiše obvestilo o napaki ( v našem primeru tekst "Vrednost mora biti nenegativno število"). Z naslednjim stavkom (e.Cancel

= true;) pa poskrbimo, da se uporabnik nikakor ne more premakniti v drugo celico vse dotlej, dokler v celico ne vnese pravilnega podatka, ali pa celoten vnos prekliče s tipko Esc.

Za gradnik DataGridView zapišimo še odzivno metodo za dogodek CellEndEdit. Ta metoda se izvede, ko je uporabnikov vnos veljaven in se uporabnik premakne v drugo celico. Koda je naslednja:

dGVTransverzala.Rows[e.RowIndex].ErrorText = "";

S tem stavkom enostavno pobrišemo vsa obvestila o napaki zaradi nepravilnega vnosa podatkov v trenutno izbrano celico.

Pojasnimo še namen dogodka DataError gradnika DataGridView. Ta dogodek zajame prav vse napake, ki nastanejo pri preverjanju uporabnikovega vnosa v katerokoli celico (predvsem velja to za celice, katerih vneseno vsebino nismo preverjali preko imena celice. Vsebina ustrezne metode poskrbi za splošno obvestilo uporabniku, obenem pa prepreči, da bi se uporabnik kljub napačnemu vnosu premaknil iz trenutne celice.

public partial class Form1 : Form {

/*spremenljivka urejanje določa, ali je gradnik DataGridView v fazi urejanja (true) ali dodajanja (false)*/

bool urejanje;

public Form1() //konstruktor obrazca Form1 {

InitializeComponent();

//na začetku je panel skrit panel2.Hide();

//DataGridView razširimo čez celoten obrazec

dGVTransverzala.Dock = DockStyle.Fill;

//določimo višino posameznih vrstic (zaradi slik) dGVTransverzala.RowTemplate.Height = 50;

//v DataGridView z metodo Items.Add dodamo tri vrstice Image slika = Image.FromFile("Triglav.JPG");

dGVTransverzala.Rows.Add("Triglav", 2863, true, "Julijske Alpe", slika, "http://sl.wikipedia.org/wiki/Triglav");

slika = Image.FromFile("Jalovec.JPG");

dGVTransverzala.Rows.Add("Jalovec", 2645, true, "Julijske Alpe", slika, "http://sl.wikipedia.org/wiki/Jalovec");

slika = Image.FromFile("Skuta.JPG");

dGVTransverzala.Rows.Add("Skuta", 2532, true, "Kamniško-Savinjske Alpe", slika, "http://sl.wikipedia.org/wiki/Skuta");

}

/*ob kliku na celico v gradniku DataGridView se najprej zgodi dogodek CellClick, za njim pa še dogodek CellContentClick. Samo za informacijo:

dogodek CellClick se zgodi pri vsakem kliku v notranjost celice, CellContentClick pa le, če kliknemo na neko vsebino v celici */

private void dGVTransverzala_CellClick(object sender, DataGridViewCellEventArgs e)

{

urejanje = true;

if (e.ColumnIndex == this.dGVTransverzala.Columns["Uredi"].Index) {

private void bShrani_Click(object sender, EventArgs e) {

if (urejanje) {

try

{

dGVTransverzala.Rows.Add(tBime.Text, nUDVisina.Value,

cBTransverzala.CheckState, cBSkupina.Text, pBSlika.Image, tBSplet.Text);

private void bPreklici_Click(object sender, EventArgs e) {

private void bIsciSliko_Click(object sender, EventArgs e) {

try

private void dGVTransverzala_CellContentClick(object sender, DataGridViewCellEventArgs e)

{

//preverim, če je bila kliknjena prava celica

if (e.ColumnIndex == this.dGVTransverzala.Columns["Splet"].Index) System.Diagnostics.Process.Start("IExplore",

dGVTransverzala.CurrentRow.Cells["Splet"].Value.ToString());

}

private void bDodaj_Click(object sender, EventArgs e) {

//odzivna metoda gumba za obdelavo tabele

private void button1_Click(object sender, EventArgs e) {

visina=visina+Convert.ToInt32(dGVTransverzala.Rows[i].Cells["Visina"].Value);

}

MessageBox.Show("Skupaj gora v transverzali: "+skupaj+"\nPovprečna višina vseh gora: "+Math.Round((double)visina/dGVTransverzala.Rows.Count,2)+"

m");

}

private void dGVTransverzala_CellValidating(object sender, DataGridViewCellValidatingEventArgs e)

{

int zacasna;

dGVTransverzala.Rows[e.RowIndex].ErrorText = "";

/*če smo naredili spremembe v stolpcu Visina, je potrebna validacija*/

if ((dGVTransverzala.Columns[e.ColumnIndex].Name == "Visina")) {

/*metoda TryParse pretvarja niz v celo število. Ima dva

parametra: prvi je tipa niz, drugi pa celo število(klic po referenci). Če pretvorba uspe, metoda vrne true, rezultat pretvorbe pa je shranjen v drugem parametru*/

private void dGVTransverzala_CellEndEdit(object sender, DataGridViewCellEventArgs e)

{

//ko je napaka odpravljena izbrišemo sporočilo o napaki dGVTransverzala.Rows[e.RowIndex].ErrorText = "";

}

//odziva metoda gumba za brisanje vrstice gradnika ataGridView private void button2_Click(object sender, EventArgs e)

{

} }

Pokažimo še, kako lahko gradnik DataGridView povežemo z nekim izvorom podatkov. O povezavi z neko tabelo iz baze bomo več napisali pri bazah podatkov, na tem mestu pa bomo pokazali povezavo z neko tipizirano zbirko.

V matematiko pogosto delamo s pravokotnimi trikotniki. Sestavimo razred PravokotniTrikotnik z dvema poljema (kateti pravokotnega trikotnika), metodo za izračun ploščine trikotnika, ter lastnostmi za izračun hipotenuze in za nastavljanje vrednosti katet.

public class PravokotniTrikotnik {

double a, b; //kateti sta zasebni polji

public PravokotniTrikotnik(double a, double b) //konstruktor {

this.Kateta_a = a;

this.Kateta_b = b;

}

//Lastnosti

public double Kateta_a //lastnost za prvo kateto {

public double Kateta_b //lastnost za drugo kateto {

public double Hipotenuza //lastnost za hipotenuzo {

get { return Math.Round(Math.Sqrt(a * a + b * b), 2);}

}

public double Ploščina //lastnost za ploščino pravokotnega trikotnika {

get { return a * b / 2.0;}

} }

V konstruktorju obrazca ustvarimo 100 objektov tipa PravokotniTrikotnik (kateti naj bosta naključni celi števili med 1 in 100) in objekte dodajmo v tipizirano zbirko trikotniki. Zbirko nato povežimo z gradnikom DataGridView (ime gradnika je DGV), ki ga pred tem postavimo na

/*v zanki ustvarimo 100 objektov tipa PravokotniTrikotnik in jih dodamo v zbirko*/

PravokotniTrikotnik p = new PravokotniTrikotnik(katetaA, katetaB);

//objekt p dodamo v zbirko trikotniki trikotniki.Add(p);

}

/*objekt DataGridView (ime gradnika je DGV in je že na obrazcu), povežemo z tipizirano zbirko Trikotniki*/

DGV.DataSource = trikotniki;

//nekatere oblikovne lastnosti gradnika DGV lahko nastavimo programsko DGV.Columns[0].DefaultCellStyle.Alignment =

DataGridViewContentAlignment.MiddleCenter;

DGV.Columns[1].DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;

DGV.Columns[2].DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleCenter;

DGV.Columns[3].DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleRight;

//oblikujmo font za glave stolpcev

DataGridViewCellStyle columnHeaderStyle = new DataGridViewCellStyle();

columnHeaderStyle.ForeColor = Color.Red;

columnHeaderStyle.Font = new Font("Verdana", 8, FontStyle.Bold);

DGV.ColumnHeadersDefaultCellStyle = columnHeaderStyle;

//določimo še širino obrazca

this.Width = DGV.Columns[0].Width * 5;

DGV.ReadOnly = true;//urejanje ni možno }

In document Načrtovanje programskih (Strani 97-105)