opcioni DODATAK: Kako povezati grafikon sa rezultatima upita ili sa delom rezultata koji su prikazani u DataGridView-u
U većíni Maturskih zadataka se nalazi grafikon u kojem treba da se prikaže deo rezultata nekog složenog upita.
Postoji više načina za prikaz podataka u grafikonu:
- za default grafikon sa kolonama - koristimo tabelu koju imamo
U ovom primeru se koristi tabela u koju se smešta rezultat upita..U isto vreme se ta tabela koristi i kao izvor podataka za neki dataGridView. U ovom slučaju ne želimo da ponovo pristupamo bazi, već da isporistimo te iste podatke iz tabele da bi se prikazali na grafikonu.
string upit = "SELECT prvi, drugi, treci,cetrvtiPodatak FROM nekaTabela";
DataTable tabela = new DataTable();
SqlDataAdapter da = new SqlDataAdapter(upit, konekcija);
...
da.Fill(tabela);
..
// dataGridView1.DataSource = tabela;
..
"Pešačka" metoda bi bila da se u niz stringova unesu sve kolone (trebaće za x-osu) a u niz brojeva da se smeste takođe sve kolone (trebaće za y-vrednosti). Na x-osi su stringovi - za šta se prikazuju podaci i to treba da se uzme iz odgovarajuće kolone u tabeli. U sledećem primeru će ti podaci biti na mestu drugi. Na y-osi su vrednosti koje treba da se prikažu u grafikonu. U sledećem primeru će vrednosti da se nalaze na mestu treci (gledate kako se zovu kolone u upitu pa se isto tako zovu i u tabeli koju ste dobili)
U sledećem primeru se na x-osi grafikona prikazuju podaci iz kolone drugi a za njih se po y-osi prikazuju podaci iz kolone treci. Naziv kolone bi mogao da se piše i u obliku sringa (asocijativni niz) ali može da se piše i samo redni broj kolone - što će biti upotrebljeno u ovom slučaju:
string[] x = new string[tabela.Rows.Count];
int[] y = new int[tabela.Rows.Count];
for (int i = 0; i < tabela.Rows.Count; i++)
{
x[i] = tabela.Rows[i][1].ToString(); // ! ! !
y[i] = Convert.ToInt32(tabela.Rows[i][2]); // ! ! !
}
chart1.Series[0].Points.DataBindXY(x, y); // ! ! !
*********************************
- pristupamo bazi po podatke, smeštamo ih u tabelu i iz tabele u Chart -
Da bismo dobili podatke koji su potrebni za grafikon pristupamo bazi pomoću odgovarajućeg upita, pa te podatke smeštamo u tabelu iz koje će se podaci dalje prikazivati na grafikonu
Pošto većina grafikona koristi jedan skup podataka za x-osu i drugi skup podataka za y-osu, logično se izvodi zaključak da bi trebalo da se kao rezultat dobije tabela koja ima samo dve kolone - jedna za x-osu i druga za y-osu.
U ovom primeru se koristi DataAdapter:
DataTable dt = new DataTable();
SqlConnection kon = new SqlConnection("-- Vaš konekcioni string --");
SqlDataAdapter da1 = new SqlDataAdapter(upit, kon);
da1.Fill(dt);
chart2.DataSource = dt;
chart2.Series[0].XValueMember = dt.Columns[0].ToString();
chart2.Series[0].YValueMembers = dt.Columns[1].ToString();
chart2.DataBind();
.
******************************
ako želite da prikažete podatke koji se već nalaze u kontroli DataGridView, dodajete to nakon popunjavanja dataGridView-a.
U deo za XValueMember i za YValueMembers se biraj indexi odgovarajućih kolona iz dataGridView-a.
U sledećem delu koda se koristi druga kolona za x-osu i treća kolona za y-osu:
chart1.Series[0].XValueMember = dataGridView1.Columns[1].DataPropertyName;
chart1.Series[0].YValueMembers = dataGridView1.Columns[2].DataPropertyName;
chart1.DataSource = dataGridView1.DataSource;
******************************
U nastavku su navedna samo dva načina, koja se često koriste na časovima :
1. način (češće korišćen):
- Napravite tabelu:
DataTable dt = new DataTable();
- Tu tabelu popunite sa rezultatom upita (pomoću DataAdaptera na primer)
- Vašoj komponenti (na primer chart2) postavite nazive u opciju XValueMember, a vrednosti u YValueMembers
chart2.Series[0].YValueMembers = "Broj pasa"; // ispisuje broj pasa na primer (druga kolona tabele)
chart2.DataSource = dt; // postavite da je tabela izvor podataka za chart2
chart2.DataBind(); // i ne zaboravite da povežete podatke
2. način:
- Na isti način kreirati tabelu kao uprethodnom delu i popuniti je podacima
- Sada prolazite kroz tabelu, red po red, dokle god ima podataka, koje ubacujete u niz i na kraju povežete sa chart-om
string[] x = new string[tabela.Rows.Count];
int[] y = new int[tabela.Rows.Count];
for (int i = 0; i < tabela.Rows.Count; i++)
{
x[i] = tabela.Rows[i][0].ToString();
y[i] = Convert.ToInt32(tabela.Rows[i][1]);
}
chart2.Series[0].Points.DataBindXY(x, y);
**************************