[ *.net @ 21.07.2002. 12:45 ] @
Dajem casnu T P rec da cu kupiti MSDN cim skupim neki din, ali ako moze jos jedno pocetnicko pitanje u vezi ADO.NET-a, odnosno VB.NET-a

Imam jednu formu i u nju ubacim data set sa sve ostalim objektima i onda napravim novu formu koja se pojavljuje na neko dugme sa onim
form2.ShowDialog()
I u toj novoj formi hocu da radim sa data setom iz prve. Kako da referenciram data set? Naravno misilo sam da je kao u VB6
Form1.dataset... tral la la
Al nije

Ovo se moze odnositi i na bilo koju drugu kontrolu, na primer hocu da menjam Text u nekom texbox-u prve forme iz druge.
[ degojs @ 21.07.2002. 16:00 ] @
Sinovac, imas zaista mnogo mogucih resenja. Upamti da su forme objekti kao i sve ostalo (dobro, skoro sve:).

Posto vidim da cesto govoris o VB6, evo ti jedno resenje u tom smislu -nesto sto podseca na PUBLIC (global) promenjive u VB6.
Dakle mi cemo imati neke public promenjive koje ce pokazivati na razne objekte (npr nase dve forme).

Recimo da imas 2 forme u projektu MyForm1 i MyForm2.
U prvoj formi imas definisano dataset sa FRIEND scope (!!).
Znaci, negde u telu klase MyForm1 si deklarisao dataset pomocu:
Code:

FRIEND MyDataSet As Dataset = New DataSet()

Dataset moras da definises kao minimalno FRIEND jer inace nista od vidljivosti u drugoj formi.

Idemo sad, dodaj jedan modul u projekt i u njemu:
Code:

Module Common
    Public Class PubVars
        Public Shared pvForma1 As MyForm1 
        Public Shared pvForma2 As MyForm2
    End Class
End Module

E to je nasa klasa PubVars koja ce drzati reference na nase objekte. Bile gde mi cemo moci da pristupamo objektima kad ih jednom referenciramo.
Polja u klasi su Public (to ti je jasno) i SHARED - mozemo da im pristupamo a da nismo instancirali klasu sa onim Dim xyz as new pubvars().

Negdje u kodu prve forme (myForm1) odradi kod (moze u Load event prve forme):
Code:

PubVars.pvForma1 = Me

Sad znaci imamo uvek pokazivac na prvu formu (PubVars.pvForma1)

Kada 'odradjujes' drugu formu sa onim npr.
Dim f2 as MyForm2 = New MyForm2
f2.ShowDialog
mozes ovo da izmenis tako da:
Code:

Dim f2 as MyForm2 = New MyForm2
PubVars.pvForma2 = f2
f2.ShowDialog


Dakle sad imamo i globalnu referencu na drugu formu.

Gotov posao. :)

Kako ces sad da pristupis datasetu (ili textboxu ili...) iz druge forme?
Jednostavno u drugoj mozes da imas npr:
Code:

datagrid1.datasource=PubVars.pvForma1.MyDataset.Tables(0)


ili iz druge forme hoces neki textbox da procitas (koji je na prvoj formi):
Code:

msgbox(pubvars.pvForm1.Textbox1.Text)


vredi i obrnuto, iz prve da kasnije pristupas kontrolama sa druge forme (koja mora da bude instancirana; odnosno da nije zatvorena), npr. negde u prvoj formi imas:
Dim TekstSaDruge as String = pubvars.pvForm2.Textbox1.Text


[Ovu poruku je menjao degojs dana 21.07.2002 u 12:50 PM GMT]
[ degojs @ 21.07.2002. 17:12 ] @
da li bi mogao da pojasnis malo ovaj hint?
probao sam - kod mene ne moze.

Po meni, logicno bi bilo da NE moze, jer system.windows.forms sadrzi neke klase iz .net frameworka, izmedju ostalih i form klasu. Nelogicno bi bilo da systems.windows.forms sadrzi neku klasu koju sam ja kreirao u svom programu, a drugo, cak i da se kojim cudom nadje tamo, meni treba referenca na ziv objekt u memoriji a ne na klasu tako da opet nigde ne stizes.

da kratko prosirim odgovor, za prosledjivanje moze jos da se koristi:
1) prosledjivanje preko konstruktora - jednostavno se prosledi prilikom instanciranja, a u formi 2 procita u konstruktoru
2) prosledjivanje preko svojstava - jednostavno se doda svojstvo drugoj formi u koje se onda postavi referenca na formu1

Mozda sam malo iskomplicirao sa onim prvim odgovorom pa evo onda i ova dva, kako ko voli.. ima sve mane i prednosti :)


[Ovu poruku je menjao degojs dana 21.07.2002 u 12:46 PM GMT]
[ jc denton @ 21.07.2002. 17:38 ] @
Zato sam i obrisao svoj post:), tvoj odgovor je daleko adekvatniji.

Moj 'hint' je bio daleko od resenja.

pozdrav
[ degojs @ 21.07.2002. 17:45 ] @
mozda si mogao i da ostavis, neko ko se prebacuje iz vb6 u vb.net ce upravo iz tog da skonta neku svoju gresku ili slicno...
sta znam.. ok:)

pozdrav
[ Dragi Tata @ 21.07.2002. 19:57 ] @
Citat:
degojs:

da kratko prosirim odgovor, za prosledjivanje moze jos da se koristi:
1) prosledjivanje preko konstruktora - jednostavno se prosledi prilikom instanciranja, a u formi 2 procita u konstruktoru
2) prosledjivanje preko svojstava - jednostavno se doda svojstvo drugoj formi u koje se onda postavi referenca na formu1

Mozda sam malo iskomplicirao sa onim prvim odgovorom pa evo onda i ova dva, kako ko voli.. ima sve mane i prednosti :)


Ova dva rešenja su daleko bolja od onog koje si detaljno opisao u prvom postu, a posebno prosleđivanje preko konstruktora.

Prosto i jednostavno: dodaš i u drugoj formi promenljivu tipa dataset i napraviš još jedan konstruktor (Sub New) koji prihvata argument tipa dataset. Zatim kad budeš kreirao objekat druge forme negde u prvoj formi, ti pozoveš ovaj konstruktor.
Ovako nekako:

Dim form2Obj As New Form2(datasetObj)

i onda direktno koristiš taj DataSet objekat kao da je član klase Form2

[ Dragi Tata @ 21.07.2002. 20:02 ] @
E,da. A ako želiš da pristupaš svim elementima form1Obj iz form2Obj, onda u formu 2 dodaš član tipa Form1, pa napraviš konstruktor koji će da tom članu dodeli vrednost, pa onda kad iz form1Obj praviš form2Obj, uradiš ovako:

Dim form2Obj As New Form2(Me)
[ degojs @ 21.07.2002. 20:26 ] @
Sad kad malo razmislim, tacno: ono prvo resenje izgleda vise kao neki work-around, ali nesto mi bilo na pameti da mu usput pokazem kako da ima 'zamenu' za Public varijable iz VB6.

Citat:

Dim form2Obj As New Form2(Me)


uuu hell yeah :)) odlican tip.
Nego, sto se ja toga nisam setio: valjda si ti zato Tata, a ja nisam ni ozenjen :))))

[ *.net @ 21.07.2002. 22:25 ] @
Sada kada sam se malo smirio i uspeo da sacuvam hardver od lomljave, javljam se da se zahvalim na odgovorima. Najbitnije mi je da mi trenutno sve radi, a to sto mi nije nista jasno gde kada zbog cega, ce se promeniti kada proctam neku knjigu od pocetka do kraja i temeljno ukapiram klase u ovom novom cudu, nadam se.
Totalno sam zbunjen trenutno. U vezi sam VB-om uvek mi je sve bilo blisko (u sestici), a sto se tice objekata to mi je isto bilo blisko kada se radi o c++ standardu koji se radi po skolama. A sada kada se radi o VB+OOP sve sam zivo pomesao.
Da li mozete da mi date savet za sledece? Jos nisam poceo ozbiljno ni vb.net ni c#.net da ucim. Sto se tice VB6 koncept mi je poznat i ta vb-ova sintaksa. Objekte kao sto rekoh kapiram sve u c++ standarnu( izuzimam MFC ). Da li da se prvo koncentrisem na c# ili vb.net ili po malo oba da pratim , ne znam ni sam, zato pitam?
[ jc denton @ 21.07.2002. 23:31 ] @
Nemoj ti nista da se sekiras, samo sedi i uci kao sto si i sam rekao :)

A mi moderatori sa ovog foruma, pokusacemo da napisemo par tekstova koji ce valjda da priblize novi VB.NET starim VB 6.0 programerima pre nogo sto im se zgadi novi VB.


pozdrav
[ degojs @ 22.07.2002. 14:49 ] @
Citat:

Da li da se prvo koncentrisem na c# ili vb.net ili po malo oba da pratim , ne znam ni sam, zato pitam?


Moj savet bi bio da se koncentrises na sam .NET framework, u prvom redu.
Nije problem VB.NET ni C# (u smislu same jezicke sintakse i principa rada) - veci problem je ogroman broj klasa u samom .NET-u. Verovatnoca je da klasa koja ce ti znatno ubrzati resenje problema vec postoji u frameworku i tu je problem - treba znati da klasa uopste postoji, a kako je onda upotrebiti mozes da nadjes u samom helpu ili na netu.
Nista ti ne skodi da pratis oba jezika, mada mozes da krenes i drugim putem:
jednom kad savladas, npr. C# lako je 'uhvatiti' VB.NET i obrnuto.