[ Sc8eR @ 20.12.2012. 03:39 ] @
Kako da promene nastale u datagridview-u updejtujem u bazi?
korisnik hoce nesto da edituje direktno u datagridview i kada klikne na dugme save te promene odlaze u bazu.

Ne mogu da uradim UPDATE preko SQL query jer ne znam koje ce kolone korisnik da edituje, a pretpostavljam da moze drugacije da se odradi.

Ako bi mogao neko da napise najprostiji kompletan primer, mnogo bi mi znacilo posto mi ni jedan od primera sa neta nije pomogao.

PS.
Znam da ima slicnih tema na forumu (i na netu uopste) ali nista od toga nije radilo.
[ ravni @ 20.12.2012. 07:21 ] @
Nije me mrzelo da isklikcem wizard. Ono sto sam dodao je
Code:
private void button1_Click(object sender, EventArgs e)
{
  customersTableAdapter.Update(northwindDataSet);
}
[ mish_ns @ 20.12.2012. 07:23 ] @
Probaj da za datagridview staviš Full row select, i onda u Click eventu datagrid-a pamtiš index selektovane vrste.
Recimo.
[ Sc8eR @ 20.12.2012. 12:39 ] @
Citat:
ravni:
Nije me mrzelo da isklikcem wizard. Ono sto sam dodao je
Code:
private void button1_Click(object sender, EventArgs e)
{
  customersTableAdapter.Update(northwindDataSet);
}


Hvala na trudu. Voleo bih da je tako jednostavno.
Znam da bi ovo trebalo da radi (cak sam i napravio novi test program i novu bazu da proverim) ali ja nisam povezivao bazu preko wizarda vec rucno posto mi je wizard stalno izbacivao neku gresku(file in use) za tu bazu koja meni treba.
Meni bas treba rucna konekcija posto tabele u bazi ne postoje , nego ih korisnik pravi i ubacuje podatke u njih.(to sam sredio preko SQL-a i sve lepo radi)
Mozda onaj problem koji javlja wizard ima neke veze sa tim, ali kazem rucna konekcija radi (sam pravi tabelu sa zeljenim imenom, dodaje kolone, upisuje podatke u tabelu).
Jedino sto ne znam kako da rucno podesim da update i delete radi direktno sa datagridview-a.
[ Sc8eR @ 20.12.2012. 12:40 ] @
Citat:
mish_ns:
Probaj da za datagridview staviš Full row select, i onda u Click eventu datagrid-a pamtiš index selektovane vrste.
Recimo.


Nisam siguran da znam kako to da uradim, ali ako stavim na full row select kako ce onda korisnik da edituje konkretnu celiju koju zeli da edituje?
[ ravni @ 20.12.2012. 13:19 ] @
Citat:
Sc8eR:...posto tabele u bazi ne postoje , nego ih korisnik pravi i ubacuje podatke u njih.(to sam sredio preko SQL-a i sve lepo radi)
Onda je mozda alat pogresan... Mozda bi im vise odgovarao Access?
[ Sc8eR @ 20.12.2012. 13:45 ] @
Mislio sam korisnik uopsteno :). Korisnik sam trenutno ja, a ovo radim vise iz treninga, mada imam ideju ko bi i kako mogao da iskoristi aplikaciju kada bude zavrsena.
Nije mi palo na pamet da koristim Access. A mislim da sigurno postoji nacin da se ovo odradi i u SQL-u. Ne vidim razliku u tome koju u cemu cu bazu da pravim.
Poenta aplikacije je unosenje podataka u bazu. To sam sve lepo odradio koristeci SQL upite i to sve radi.
Ali ono sto mi ne radi je izmena podataka direktno iz datagridview-a.
Ne mogu da koristim TableAdapter jer ne znam ime TableAdaptera pre nego sto korisnik podesi podatke za unos. (mozda moze nekako drugacije?)
Jedino sto meni pada na pamet je da bindujem kolone i textbox-ove iz kojih unosim podatke pa da izmene vrsim u textbox-ovima, ali to nije ono sto hocu.
[ plague @ 20.12.2012. 14:02 ] @
Zasto ne bi koristio DataGridView.CellValueChanged event?
Kada se promeni vrednost Cell-a, preko DataGridViewCellEventArgs mozes naci koji je red u pitanju, iz reda izvuces ID i odradis Update za taj ID.

Ovo pisem napamet bez prethodnog testiranja.
[ Cortex85 @ 20.12.2012. 14:16 ] @
Probaj da podatke iz DataSeta bindujes na DataGridView pomocu BindingSourcea, olaksaces si zivot.
[ Sc8eR @ 20.12.2012. 20:00 ] @
Citat:
plague:
Zasto ne bi koristio DataGridView.CellValueChanged event?
Kada se promeni vrednost Cell-a, preko DataGridViewCellEventArgs mozes naci koji je red u pitanju, iz reda izvuces ID i odradis Update za taj ID.

Ovo pisem napamet bez prethodnog testiranja.


Nije problem dogadjaj na koji ce se aktivirati komande. To moze da ide i preko dugmeta save.
Jel ja onda treba da proveravam svaku celiju posebno? Hmm... probacu mada mi deluje previse komplikovano. Ja sam bio ubedjen da postoji neki krajnje jednostavan (glup) nacin. Mada to je verovatno onda ono sa tableadapterom.
[ Sc8eR @ 20.12.2012. 20:02 ] @
Citat:
Cortex85:
Probaj da podatke iz DataSeta bindujes na DataGridView pomocu BindingSourcea, olaksaces si zivot.


Mislis uz pomoc wizarda ili rucno? Wizard ne mogu da koristim, pisao sam zbog cega.
A za rucno nisam siguran kako da uradim i kako ce mi to pomoci, ako mozes malo bolje da objasnis, ili neki primer ako imas- jos bolje.
[ mish_ns @ 21.12.2012. 06:41 ] @
U pravu si za fullrowselect. Dosta je teško. Ja sam radio što na click event odredim vrstu dgv-a, i kopiram 1 polje koje mi je ključ. Ali sam koristio textBox za izmenu podataka, a tebi treba direktno iz dgv-a.
Kolege su ti dale neke dobre ideje pa probaj tako.

Imaš neke primere ovde:
http://social.msdn.microsoft.com/Forums/en/csharplanguage/thread/8db841fc-ffa7-4519-b6f5-d054c7190948

http://social.msdn.microsoft.com/Forums/en-US/sqldataaccess/thread/060f7ef5-eacb-4be5-b2cd-2d3c3ae05bec/

http://support.microsoft.com/kb/308055
[ Cortex85 @ 21.12.2012. 07:25 ] @
Primer:
Code:

/********************************************
                  NAPAMET KUCAN KOD
*********************************************/
BindingSource bs = new BindingSource();
DataTable dt  = new DataTable(); 
TableAdapter ta = new TableAdapter();
bs.DataSource = dt;
dgv.DataSource = bs;

private void btnSaveClick(object sender, EvengArgs e)
{
         bs.EndEdit();
         ta.Update(dt); 
}


Nemoj da zaboravis da u metodi u kojoj radis update vrednosti u bazu pozoves EndEdit() BindingSourca.
Ovo je kucano na brzinu samo kao primer kako da ih povezes kroz kod, kada budem imao VS u blizini ako i dalje budes imao problema okacicu ti primer.
[ Sc8eR @ 21.12.2012. 10:21 ] @
Citat:
mish_ns:
U pravu si za fullrowselect. Dosta je teško. Ja sam radio što na click event odredim vrstu dgv-a, i kopiram 1 polje koje mi je ključ. Ali sam koristio textBox za izmenu podataka, a tebi treba direktno iz dgv-a.
Kolege su ti dale neke dobre ideje pa probaj tako.

Imaš neke primere ovde:
http://social.msdn.microsoft.com/Forums/en/csharplanguage/thread/8db841fc-ffa7-4519-b6f5-d054c7190948

http://social.msdn.microsoft.com/Forums/en-US/sqldataaccess/thread/060f7ef5-eacb-4be5-b2cd-2d3c3ae05bec/

http://support.microsoft.com/kb/308055


Hvala na linkovima.
Na neke od njih sam vec naisao guglajuci (stigao sam do 4 strane na guglu trazeci :D) a ostale cu pogledati cim budem seo za svoj racunar.
[ Sc8eR @ 21.12.2012. 10:31 ] @
Citat:
Cortex85:
Primer:
Code:

/********************************************
                  NAPAMET KUCAN KOD
*********************************************/
BindingSource bs = new BindingSource();
DataTable dt  = new DataTable(); 
TableAdapter ta = new TableAdapter();
bs.DataSource = dt;
dgv.DataSource = bs;

private void btnSaveClick(object sender, EvengArgs e)
{
         bs.EndEdit();
         ta.Update(dt); 
}


Nemoj da zaboravis da u metodi u kojoj radis update vrednosti u bazu pozoves EndEdit() BindingSourca.
Ovo je kucano na brzinu samo kao primer kako da ih povezes kroz kod, kada budem imao VS u blizini ako i dalje budes imao problema okacicu ti primer.


Za EndEdit nisam znao, probacu da iskoristim.
Ali ovo za table adapter ne mogu da iskoristim jer ne mogu da instanciram tableAdapter. Ne postoji klasa TableAdapter. Jel treba da dodam u using jos nesto osim SqlClient?
A ako je dodam preko wizarda, doda tableAdapter za jednu tabelu, a meni treba za vise i ne znam unapred koja je tabela.
[ ravni @ 21.12.2012. 11:53 ] @
Citat:
Sc8eR: ...i ne znam unapred koja je tabela.
Nije mi jasno ovo. Kazes da ne znas koja je tabela, a kako onda ucitavas podatke u grid? Daj malo konteksta da znamo kako radis sada.
[ Cortex85 @ 21.12.2012. 12:07 ] @
Moja greska nisam citao celu temu nego samo delove, pa sam na osnovu toga dao predlog.


Ti se ovde suocavas sa jednim drugim problemom a to je generisanje CRUD upita jer ti ne znas unapred strukturu podataka tabele. Aplikacija na kojoj radis je neka vrsta DB management alata?
[ Sc8eR @ 21.12.2012. 12:46 ] @
Citat:
ravni:
Citat:
Sc8eR: ...i ne znam unapred koja je tabela.
Nije mi jasno ovo. Kazes da ne znas koja je tabela, a kako onda ucitavas podatke u grid? Daj malo konteksta da znamo kako radis sada.


Po pokretanju aplikacije ucitava se tabela u zavisnosti od trenutnog meseca.
A preko combobox-a korisnik menja tabelu (mesec) za koji zeli da vidi podatke.
A koliko sam ja video da bi mogao da koristis TableAdapter, moras preko wizarda da odredis za koju tabelu hoces tableAdapter koji onda dobija ime ImeTabeleTableAdapter1, a meni bi onda trebao table adapter za svaki mesec do sad i svaki mesec u buduce posto aplikacija automatski kreira novu tabelu kad dodje naredni mesec.
Nadam se da ovo ima bar nekog smisla :D
[ Sc8eR @ 21.12.2012. 12:53 ] @
Citat:
Cortex85:
Moja greska nisam citao celu temu nego samo delove, pa sam na osnovu toga dao predlog.


Ti se ovde suocavas sa jednim drugim problemom a to je generisanje CRUD upita jer ti ne znas unapred strukturu podataka tabele. Aplikacija na kojoj radis je neka vrsta DB management alata?


Da, tako nesto. To je u sustini evidencija. Aplikacija automatski kreira tabele sa imenom tekuceg meseca.
Sve funkcionise ok samo sto ne mogu da menjam podatke u datagrid-u.
ImeTabeleTableAdapter1.Update(dataset) radi ono sto hocu ali samo kad imam jednu tabelu i kad dodam tu tabelu u tableadapter preko wizarda (napravio sam novu aplikaciju i probao za jednu tabelu).
[ plague @ 21.12.2012. 13:06 ] @
Zasto bi kreirao tabelu sa imenom tekuceg meseca? Da li svaka od tabela koja se zove po mesecu zapravo pamti iste podatke (ima iste kolone)?
[ Sc8eR @ 21.12.2012. 13:11 ] @
Ima iste kolone ali drugaciji podaci se unose.
[ ravni @ 21.12.2012. 13:13 ] @
Kvota 1.05 na 'Da' :)))

Edit: Pretece me.
[ plague @ 21.12.2012. 13:22 ] @
Savetovao bih ti da se dodatno pozabavis osnovama baza, jer takav dizajn je daleko od optimalnog.

Ovde bez dileme mozes dodati kolonu DatumUpisa i koristiti je da dalje filtriras prikaz kako ti odgovara (npr po godini/mesecu/danu). Cak bi u tom slucaju verovatno nehotice resio problem koji imas sa DGV-om.
[ Sc8eR @ 21.12.2012. 14:16 ] @
Nije mi bitno da bude optimalno. Rekoh ranije da ovo radim radi treninga. Znam da bi mi mnogo lakse bilo da imam jednu jedinu tabelu i da sve komande ubacim preko wizarda, i da dodam po jednu liniju koda za svaki dogadjaj, ali nije poenta da bude lakse nego da naucim sustinu.
Hteo sam da mi aplikacija automatski pravi tabele na odredjeni datum. Cinilo mi se kao koristan dodatak aplikaciji, pa sam hteo da vidim da li mogu to da uradim (to sam uspeo). Imam i kolonu datum koja mi prikazuje DAN unosa. Znam da mogu da preko sql upita izvucem iz baze prikaze samo za odredjeni mesec, ali ovako mi je delovalo nekako preglednije u SQL managmentu.
[ plague @ 21.12.2012. 14:52 ] @
Mozda je preglednije, ali napravice ti nocnu moru kad-tad. Evo npr treba ti izvestaj za 2 meseca, sta ces raditi? Meni jedino na pamet pada UNION, pritom zamisli da treba za odredjenog korisnika zadnjih 3 godine, to je mnogo UNION-a.

Druga strana, a jos nidje koda. Hajde postuj nam kako tacno popunjavas(prikazujes) DGV za ordjeni mesec. Posto kazes da je rucno, ti mozes rucno i preko DataSeta i SqlDataAdapter-a, ne mora to bas preko wizarda.
[ Sc8eR @ 21.12.2012. 15:06 ] @
Pitanje je da li ce aplikacija uopste da se koristi za nesto, ali shvatam poentu. Na losim temeljima kuca nece stajati.
Ako bude potrebe da se aplikacija koristi za nesto konkretno, verovatno cu preraditi bazu za samo jednu tabelu.
Ali sta ako mi nekad bas treba vise tabela i ne mogu sve da strpam u jednu? Mislim da ce mi koristiti da znam kako se to moze uraditi, a hocu i da iskoristim ovaj inat sto se probudio u meni da naucim nesto novo :D.

a sto se tice popunjavanja DVG to ide ovako

private void dgUpdate(string table)
{
da = new SqlDataAdapter();
da.SelectCommand = new SqlCommand("SELECT * FROM " + table + " ORDER BY dan", con);
ds.Clear();
da.Fill(ds);

dg.DataSource = ds.Tables[0];
dg.Refresh();
}
Samo pozovem funkciju na odgovarajucem mestu i prosledim joj ili mesec iz trenutnog datuma, ili izabrani text iz combobox-a u zavisnosti od toga gde mi sta treba.
[ Sc8eR @ 21.12.2012. 16:59 ] @
Ako nekog zanima uspeo sam da sredim.

Problem je bio u koriscenju metode Clear() tj u njenom mestu pozivanja.
Prepravio sam svoju funkciju i mesta na kojima se poziva i sada radi.
Evo funkcija
private void Prikazi(string tabela)
{
da = new SqlDataAdapter("SELECT * FROM " + tabela + "", con);
cb = new SqlCommandBuilder(da);
con.Open();
ds.Clear();
da.Fill(ds, tabela);
dg.DataSource = ds.Tables[tabela];
con.Close();
}

a evo i konkretnog koda na dugmetu koji cuva izmene u bazi
da.Fill(ds, comboBox1.Text);
da.Update(ds, comboBox1.Text);
Prikazi(comboBox1.Text);

Ove dve funkcije (Fill i Update) su takodje pravile problem dok nisam dodao i source tabelu za table mapping (ranije sam pozivao prosledjujuci samo dataset: da.Update(ds))

Hvala svima na trudu stvarno je pomoglo. :)
[ Sc8eR @ 21.12.2012. 17:04 ] @
E jos jedna stvar pa zatvarajte temu ako hocete.

Jel bolje da prepravljam kod i da sve stavim u istu tabelu ili da ostavim sve ovako sada kada radi?
Ovako mi deluje preglednije ali ako ce biti previse problema za ubuduce, onda bolje prepraviti sad nego kasnije.

Edit:
Izvinjavam se za trostruki post, ovo sigurno krsi neka forumska pravila :)