Šta je novo?

C#, Access, databindings itd. NEED HELP

Marvin

Čuven
Učlanjen(a)
26.09.2002
Poruke
356
Poena
620
Povezao sam C# sa bazom pomocu oledbconnection i oledbdataadapter a podatke prikazujem pomocu dataseta i databindings svojstava na textboxovima.

Na formi imam desetak textbox-ova. Svakom od njih je polje databinding povezano sa jednim poljem u tabeli.
Takodje, na formi je jedan combo box, koji je preko svojstva datasource povezan sa datasetom.

I to sve lepo radi kada je u pitanju pregled. Kada menjam vrednosti na combo box-u menjaju se i vrednosti u text box-ovima.
Medjutim, problem nastaje kada pokusam da te izmene prenesem na bazu. Kod koji sam ubacio je sledeci:


Kod:
oleDbConnection1.Open();
oleDbDataAdapterIgraci.Update(dataSetIgraci1, "igrac");
oleDbDataAdapterIgraci.Fill(dataSetIgraci1);
oleDbConnection1.Close();

U nekoj knjizi sam video da nije dovoljno samo u properties podesiti databinding svojstvo za pojedinacne kontrole, nego da treba i u kodu ovako nesto da se ubaci (npr u metodu selectedvaluechanged combo box-a):


Kod:
txtAdresa.DataBindings.Clear();
txtAdresa.DataBindings.Add("Text", dataSetIgraci1.igrac.Rows[comboBox1.SelectedIndex], "adresa");


Medjutim, kada za svaki text box uradim ovo, krene da mi izbacuje exception-e, kako u nekim poljima baze imam dbNull vrednosti.
Ok, kako onda to da resim? Ako ne moze automatski da se dbNull konvertuje u prazan string ili broj 0 ili tako nesto, kako to da uradim eksplicitno?

Imam jos par pitanja, ali za pocetak kako ovo da resim?

Hvala dobrim dusama (programerima :D) unapred.
 
C#, access, jel to znaci da pravis neku ASP.NET aplikaciju?

Ne razumem bas tvoje pitanje do kraja, ali ako pravis jednostavniju aplikaciju uz minimlano pisanje koda, preporucujem ti vrlo dobar tutorijal :ASP.NET Data tutorijal http://www.asp.net/learn/dataaccess/default.aspx?tabid=63 razjasnice ti mnoge stvari.
Ako si te bazicne stvari vec savladao i hoces da se bavim OOP-om i 3-slojnom arhitekturom aplikacija pogledaj ovaj tutorijal: http://www.spaanjaars.com/QuickDocId.aspx?quickdoc=416

I zapamti jednu stvar, sve sto vidis u jenoj knjizi moze da se uradi bar na jos tri nacina i da svi budu dobri, nemoj samo da se slepo drzis jedne knjige, vec razvijaj svoj stil razmisljanja i programiranja uz postovanje pravila dobrih perfomansi i na konju si.
 
Fill ide pre Update, a ne obratno.

MS ima sjajnu dokumentaciju sa gomilom primera za programere, tj. MSDN. Naći ćeš tamo sve što ti treba. Ako imaš instaliran na HDD, još bolje i brže.

Nas ispituj za neke logičke zavrzlamice i prave probleme, ovime ovladaj sam, nemoj da si lenj ;)

p.s. A sad pročitah drugi deo pitanja :D
Stavi u Access bazi da polja mogu da imaju Null vrednost i ne bi trebalo da imaš problema.
 
Poslednja izmena:
Obojica ste me pogresno shvatili.
Kao prvo, nije u pitanju ASP.NET nego cist C# i to desktop, jednokorisnicka aplikacija tj. IS

Drugo, u Access bazi polja imaju NULL vrednosti, nego imam problem kad ih prebacujem iz Accessa u C#.

Trece, DataSet je vec napunjen, ovaj fill posle update je samo da DataSet azurira tj. ponovo iscita podatke iz DataAdaptera.

Cetvrto, imam MSDN na hardu i verujte mi prekopavao sam ga i milion primera sam probao ne bih odmah ovde trazio pomoc da nisam vec pokusao svasta.

U svakom slucaju hvala vam, nadam se da sam sad bio jasniji?
 
OK, hajde da krenemo iz početka. Nemoj da se ljutiš što ću da pojednostavljujem, to je za dobrobit komunikacije. Ti reci slobodno "ama nisam bilde, ne smaraj" ;)

Pretpostaviću da koristiš VS2005. I pretpostaviću da ne želiš da pišeš kod već da ti ga VS generiše. Tako mi je najlakše da objasnim.

1. Kreiraj novu aplikaciju čisto za potrebe testa.
2. Kreiraj novu konekciju ka Access bazi. Pitaće te da napravi i DataSet. Uradi i to i selektuj sve tabele (i Views ako ti treba).
3. Izaberi DesignView za formu. Kada si na DesignView u prozoru DataSources možeš da vidiš tvoje tabele. Klikom na naziv tabele se pojavljuje strelica na dole. Imaš izbor kako bi želeo da prikažeš podatke: DataGridView ili Details. Izaberi Details.
Klikni na naziv tabele koja tebi treba i prevuci je na formu. VS ti automatski napravi labele i TextBox-ove.
4. Ali ti ne želiš TextBox za neko polje, već DropDownList. Cool. Dodaj novi DropDownList. Kada ga selektuješ pojavi mu se mala strelica u gornjem-desnom uglu. Klikni na nju i tu su ti opcije za povezivanje sa bazom.
Za DataSource pronađi tabelu odakle hoćeš da vučeš podatke u DropDownListu
DisplayMember je ono što želiš da se vidi u DropDownListi
ValueMember je ono što želiš da bude prosleđeno u tvoju tabelu
SelectedValue je polje u tvojoj tabeli koje želiš da popuniš sa ValueMember vrednosti

VS ti je kada si prevukao tvoju tabelu (korak 3) ubacio i njegov BindingNaigator.
Kada se klikne na SaveData dugme izvršiće se upis u bazu i ponovno učitavanje (to ti hoćeš).

Ako nećeš njihovo rešenje razvi svoje na osnovu koda koji je generisao sam VS.
Evo tog koda:

Kod:
private void automobiliBindingNavigatorSaveItem_Click(object sender, EventArgs e)
        {
            this.Validate();
            this.automobiliBindingSource.EndEdit();
            this.automobiliTableAdapter.Update(this.konfig_DataSet.Automobili);

        }

        private void Form1_Load(object sender, EventArgs e)
        {
            // TODO: This line of code loads data into the 'konfig_DataSet.Karoserije' table. You can move, or remove it, as needed.
            this.karoserijeTableAdapter.Fill(this.konfig_DataSet.Karoserije);
            // TODO: This line of code loads data into the 'konfig_DataSet.Automobili' table. You can move, or remove it, as needed.
            this.automobiliTableAdapter.Fill(this.konfig_DataSet.Automobili);

        }

Ništa drugo nema u mom C# fajlu (lažem, ima InitializeComponent() u konstruktoru forme) :D
Naravno da u Form1.Designer ima još dosta toga, a verovatno ti je bitan sledeći kod koji u stvari generiše VS kada popuniš DataSource, DisplayMember, ValueMember, SelectedMember...

Kod:
// comboBox1
            // 
            this.comboBox1.DataBindings.Add(new System.Windows.Forms.Binding("SelectedValue", this.automobiliBindingSource, "KaroserijaID", true));
            this.comboBox1.DataSource = this.karoseri****ndingSource;
            this.comboBox1.DisplayMember = "Karoserija";
            this.comboBox1.FormattingEnabled = true;
            this.comboBox1.Location = new System.Drawing.Point(167, 102);
            this.comboBox1.Name = "comboBox1";
            this.comboBox1.Size = new System.Drawing.Size(121, 21);
            this.comboBox1.TabIndex = 35;
            this.comboBox1.ValueMember = "KaroserijaID";

Nadam se da ti je ovo od pomoći.
Pozdrav.

p.s. Ako želiš mogu da ti pošaljem ovaj primer sa sve bazom na mail, ali to već na PM.
 
To lave ti si car :D
Ovo sljaka sjajno, imam jos neka pitanja ali to cu veceras kasnije da postavim. 10x !
 
Da... Samo sto ne bi trebalo da se navikavas da radis te stvari pomocu vizarda.
 
Pa ja sam prvo i probao bez wizarda samo sam imao nekih problema. Mada, jedino novo u svemu tome je bio binding navigator koji mi je ucinio veliki posao.

Samo sto sad ne mogu da nadjem gde je smesten kod za pojedinacnu dugmad iz binding navigatora.
Konkretno, za dodavanje novog sloga i brisanje postojeceg. Hocu da tu dodam jos neke provere, ali ono sto je napisao Nick za SaveItem nisam uspeo nigde da nadjem.

Da pojasnim, hocu kad kliknem na brisanje da prvo pitam korisnika da li je siguran da to hoce da uradi pa tek onda da brisem. Za sada samo imam ideju da to uradim pesacki pomocu mouse down itd.
Ideja?
 
Idemo dalje sa kursom :D

Ima nekih pojašnjenja na ovom linku (doduše za VB, ali meni je to sve isto)
http://www.15seconds.com/issue/060420.htm
ali konkretno za brisanje, tj. da pita korisnika da li želi da obriše je sledeća procedura.

Klikni na BindingNavigator tvoje tabele. U Properties ćeš između ostalog videti DeleteItem koji ima vrednost bindingNavigatorDeleteItem. To je podrazumevano kada ti VS generiše kod, kao što si uradio po mojim instrukcijama. To znači da se izvršava unapred određena funkcija za brisanje trenutno aktivnog podatka.

Ti to želiš da promeniš. Zato izaberi sa spiska komandi none. Klikni dva puta na ikonicu za brisanje BindingNavigatora i ubaci kod ove funkcije u nju (izmeni za tvoj BindingSource):
Kod:
private void bindingNavigatorDeleteItem_Click(object sender, EventArgs e)
        {
            if (MessageBox.Show("Da li želite da obrišete ovaj podatak?", "Brisanje podataka", MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2) == DialogResult.Yes)
            {
                this.automobiliBindingSource.RemoveCurrent();
                this.automobiliTableAdapter.Update(this.konfig_DataSet.Automobili);
            }
        }

Mislim da bi trebalo da ti je jasan ovaj kod. Ako nije - pitaj šta ti je nejasno.

Isti je princip i za kreiranje novog sloga, tj. ako hoćeš da se drugačije ponaša, a ne kako je VS zamislio.

Šta sam ja to napisao za SaveItem što nisi mogao da pronađeš? Nije mi jasno...

Poz.
 
Sada mi je jasnije.
Mada, resio sam i ovo pitanje pre tvog posta, samo malo manje elegantno. Naime, u metodu MouseDown sam stavio pitanje da li je korisnik siguran, pa ako jeste onda se akcija izvrsava, a ako nije onda nista.

Nick hvala ti puno. Seminarski je gotov, sutra ga predajem. Mogu i da okacim ovde samo ne bi da se brukam :)
U svakom slucaju imas pivo kad se vidimo :D
 
Ovako...

Sve si super odradio ovo sa prikazivanjem, samo sto Update metodu treba da stavis u poseban event handler. Znaci, imas jedno dugme Update i kad pritisnes njega on pozove samo tu metodu.

Sto se tice navigatora, imas 4 buttona, Prvi, Prethodni, Sledeci i Poslednji (<< < > >>) i a u njima sledeci kod respektivno:

this.BindingContext[ds, "ime tabele u ds"].Position=0;

this.BindingContext[ds, "ime tabele u ds"].Position++ (ili -- u dugmetu za smanjivanje)

this.bindingContext[ds, "tabela"].Position = this.BindingContext[ds, "tabela"].Count-1;


ds - ime tvog dataseta
 
Poslednja izmena:
I jos nesto, nadam se da znas da Update metoda snima promene samo u jednoj tabeli dataseta te da ako hoces da updatujes vise povezanih tabela, koristis transakcije.
 
I ti imas pivo :D
To je mene zanimalo, sta u stvari rade ti dugmici u navigatoru. Posle sam slucajno u msdn nasao objasnjenje, ali hvala u svakom slucaju.
 
Nazad
Vrh Dno