Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Dva toboze laka pitanja

[es] :: .NET :: Dva toboze laka pitanja

[ Pregleda: 3672 | Odgovora: 19 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

Mikelly

Član broj: 16730
Poruke: 389
*.crnagora.net.



Profil

icon Dva toboze laka pitanja05.02.2008. u 13:28 - pre 197 meseci
1. Komunikacija medju formama.
Konkretno, imam formu na kojoj mi se nalazi dataset i jedan bindingsource. Posto mi to treba u vecini formi, kako da iz ostalih formi pristupan ovom bindingsource-u.

2. Formatizacija sadrzaja textbox-a.
Iako ovo izgleda dosta lako, ne mogu nikako da rijesim. Imam textbox i u njemu vrijednost recimo 7.6732147. Sto da ucinim da mi se u textboxu prikaze vrijednost 7.67 ili 7.673 (zavisno koliko decimala odaberem). Da li to radi sam objekat textbox ili mu kao value moram proslijediti vec formatiranu vrijednost?

Pozdrav.
 
Odgovor na temu

Predrag Glumac
Luxembourg

Član broj: 167588
Poruke: 127
*.eunet.yu.



Profil

icon Re: Dva toboze laka pitanja05.02.2008. u 13:38 - pre 197 meseci
1. Najlakse, po meni, je da napravis klasu izvedenu od Forms klase u kojoj imas static polje sa BindingSourceom. Ostale forme se nasledjuju iz te klase.

2. Formatiranje zavisi od toga kako textbox dolazi do vrednosti: ako mu iz koda dodeljujes vrednost onda je formatiraj sa npr. ToString("#.##"), ako si bindovao na datasource, koristi evente Parse i Format, a ako korisnik treba da unosi umesto textBoxa koristi MaskedTextBox.
 
Odgovor na temu

Bojan Komazec
Bojan Komazec

Član broj: 41269
Poruke: 11
..nge86-134.btcentralplus.com.



Profil

icon Re: Dva toboze laka pitanja06.02.2008. u 00:24 - pre 197 meseci
Upotreba static (ili globalnih) promenljivih nije preporucljiva jer one nemaju dovoljan stepen zastite (skrivenosti) i mogu se lako menjati iz razlicitih delova koda pa postoji sansa da dodje do korupcije/izmene originalnog sadrzaja. (Ako se ipak odlucis za ovaj pristup, dovoljno bi bilo da imas jednu dummy public klasu koja bi imala public static member - DataSource. To je dovoljno pa da mu mozes pristupati iz bilo koje druge klase u aplikaciji).

Kod pisanja WinForm aplikacija uvek je dobro razgraniciti tri grupe objekata (klasa): objekte koji cuvaju podatke (data), objekte koji njima manipulisu (engine) i objekte koji sluze za interakciju sa korisnikom (GUI). Posto u tvom slucaju vise GUI objekata (Win formi) treba da pristupa jedinstvenom DataSource objektu (uopsteno), mozes napraviti jednu singleton klasu koja ce cuvati (tj. wrapp-ovati) taj DataSource objekat. DataSource bi bio private member, sa metodom koja ga inicijalizuje/popunjava i public property-jem za pristup (get()) - preko njega bi ostale klase (u tvom slucaju - forme) pristupale DataSource-u.
 
Odgovor na temu

Predrag Glumac
Luxembourg

Član broj: 167588
Poruke: 127
*.eunet.yu.



Profil

icon Re: Dva toboze laka pitanja06.02.2008. u 01:08 - pre 197 meseci
Citat:
komarabbit: Upotreba static (ili globalnih) promenljivih nije preporucljiva jer one nemaju dovoljan stepen zastite (skrivenosti) i mogu se lako menjati iz razlicitih delova koda pa postoji sansa da dodje do korupcije/izmene originalnog sadrzaja.

Zar to nije upravo sta je covek hteo postici ? Da moze da menja iz razlicith delova koda, tj. formi. Ja BindingSource vezujem za Presentation Layer vise nego bilo koji drugi. Kao interfejs izmedju presentaion layera i bussiness logic/data layera.
Citat:
Posto u tvom slucaju vise GUI objekata (Win formi) treba da pristupa jedinstvenom DataSource objektu (uopsteno), mozes napraviti jednu singleton klasu koja ce cuvati (tj. wrapp-ovati)

Mozda je u tome stvar - nije neki datasource, nego BindingSource, tako da racunam da covek zeli da u pod formama vidi nekakve child view-ove od trenutno selektovanih podataka sa glavne forme i da ih eventualno menja.

Nemoj da me shvatis pogresno, nije da te napadam, ja koristim ovaj pristup pa me zanimaju pros i cons
 
Odgovor na temu

Mikelly

Član broj: 16730
Poruke: 389
*.crnagora.net.



Profil

icon Re: Dva toboze laka pitanja06.02.2008. u 09:54 - pre 197 meseci
Vidim da ste vi mnogo vise 'advanced' od mene.

Text boxovi su boundovani na datasource. Onda Glumac, ti mi rece da koristim Parse i Format evente. Evente cega (bindingsource-a, ili cega vec). Ajde kad te molim jedan primjer kratak...

Pozdrav..
 
Odgovor na temu

Predrag Glumac
Luxembourg

Član broj: 167588
Poruke: 127
*.eunet.yu.



Profil

icon Re: Dva toboze laka pitanja06.02.2008. u 11:09 - pre 197 meseci
TextBox kontrolu si bindovao preko
Code:
textBox1.Bindings.Add("Text", bndsrc, "NekoPolje");


Sve sta treba da uradis je da za taj binding dodas evente Parse i Format:
Code:
 Binding myBind;
 myBind = textBox1.DataBindings.Add("Text", bndsrc, "NekoPolje");
 myBind.Parse += new ConvertEventHandler(myBind_Parse);
 myBind.Format += new ConvertEventHandler(myBind_Format);
.
.
.
//I event hendleri kori rade formatiranje i parsiranje
void myBind_Format(object sender, ConvertEventArgs e)
{
e.Value = ((decimal)e.Value).ToString("#.##");
}

void myBind_Parse(object sender, ConvertEventArgs e)
{
e.Value = Decimal.Parse(e.Value.ToString());
}


Happy coding ;)
 
Odgovor na temu

Mikelly

Član broj: 16730
Poruke: 389
*.crnagora.net.



Profil

icon Re: Dva toboze laka pitanja07.02.2008. u 13:14 - pre 197 meseci
Super. Hvala, ovo radi super, bas ono sto sam trazio. Ocekivao sa da sama kontrola odradi formatizaciju sadrzaja, a ne da se to mora odradit na nivou binding-a.

A sad sledece pitanje, kako da formatizujem textbox-ove unutar datagridviewa, idem li istom logikom?

I koji je najbolji event datagridview-a pomocu kojeg mogu da napravim proceduru koja se trigeruje kada novi red bude odabran.

Hvala i oprosti sto te mucim, ove evente jos nijesam savladao kako treba.
 
Odgovor na temu

Predrag Glumac
Luxembourg

Član broj: 167588
Poruke: 127
*.eunet.yu.



Profil

icon Re: Dva toboze laka pitanja07.02.2008. u 13:24 - pre 197 meseci
Neces moci jer se textboxovi unutar datagrid drugacije binduju, ali mozes da postavis na toj koloni property DefaultCellStyle.Format na npr. "#.##".
Citat:
I koji je najbolji event datagridview-a pomocu kojeg mogu da napravim proceduru koja se trigeruje kada novi red bude odabran.

Mislis ako se samo promeni selekcija ili ako se doda novi red ? Imas evente SelectionChanged i RowsAddes .....
 
Odgovor na temu

Mikelly

Član broj: 16730
Poruke: 389
*.crnagora.net.



Profil

icon Re: Dva toboze laka pitanja07.02.2008. u 14:22 - pre 197 meseci
Sad pricam napamet, ali cini mi se da sam to svojstvo Format pokusao podesit, ali mi je prijavljivao gresku NullReference, ali opet ti kazem nisam siguran.

Sto se tice drugog pitanja, koristio sam RowEnter event, i datagridview mi nece pogrijesit red (mislim ako klikem na jedan red da mi se to reflektuje na drugi, naravno), ali isto tako, nekad trigeruje dogadjaj kad kliknem na red, a nekad kad ga napustim, mozda ja to pogresno gledam.

Pozdrav...
 
Odgovor na temu

Bojan Komazec
Bojan Komazec

Član broj: 41269
Poruke: 11
193.192.33.*



Profil

icon Re: Dva toboze laka pitanja12.02.2008. u 13:18 - pre 197 meseci
Citat:
Predrag Glumac: Mozda je u tome stvar - nije neki datasource, nego BindingSource, tako da racunam da covek zeli da u pod formama vidi nekakve child view-ove od trenutno selektovanih podataka sa glavne forme i da ih eventualno menja.

Nemoj da me shvatis pogresno, nije da te napadam, ja koristim ovaj pristup pa me zanimaju pros i cons :)


Ok, moj prethodni odgovor je bio uopsten pa cu sada biti malo precizniji :)

Ja licno izbegavam upotrebu ogoljenih static promenljivih jer cim pomislim na rec "static", odmah postavljam pitanje sigurnosti u multithread okruzenju (thread safety). WinForm aplikacije gotovo uvek imaju vise tredova (GUI tredovi za forme i worker tredove za obradu podataka u pozadini) i zato postoji mogucnost da dodje do konflikta pri istovremenom pristupanju static objektu. BindingSource klasa nije thread safe klasa i zato se pri radu sa njom mora primeniti neki sinhronizacioni mehanizam (npr. lock-ovanje). Mislim da ne bi bilo dobro ako bi se on implementirao u klasi Forme jer bi se tako u nju ubacio kod koji joj prirodno ne pripada. Zato sam predlozio da se kreira posebna singleton klasa koja bi enkapsulirala BindingSource objekat (thread safe wrapper). Sve GUI kontrole za koje bi BindingSource bio vezan preko DataSource property-ja sada bi mu pristupale bezbedno, iz razlicitih tredova. Ako smo sigurni da ce se BindingSource objektu pristupati iz jedne pa iz neke druge forme, tada ne mora doci do konflikta. Ali ako se npr. desi da iz jedne forme korisnik menja ili brise red u tabeli a u nekoj drugoj formi je istovremeno potrebno pristupiti podacima iz tog reda (npr. u nekom sql upitu), tada moze doci do konflikta (race condition).

Druga stvar koja je kriticna kod static promenljivih je njihov zivotni vek i zauzimanje memorije. One zauzimaju memoriju odmah nakon ucitavanja aplikacionog domena i automatski bivaju inicijalizovane na default vrednost njihovog tipa. Moze se desiti da se ni ne dodje do momenta njihove upotrebe (npr. banalan primer - korisnik se ne uloguje uspesno pa ne moze da pristupa podacima) a memorija je vec zauzeta, i ostace zauzeta sve dok se aplikacija ne zavrsi. Opseg gde je static promenljiva vidljiva (scope) je ceo aplikacioni domen a uvek je pozeljno suziti ga sto je moguce vise - tako se pomaze Garbage Collector-u da sto pre izvrsi ciscenje memorije i time je manja sansa da dodje do njenog curenja. Ovo ne mora biti kritican problem ali ga treba uzeti u obzir ako su performanse vazne.


 
Odgovor na temu

Predrag Glumac
Luxembourg

Član broj: 167588
Poruke: 127
*.eunet.yu.



Profil

icon Re: Dva toboze laka pitanja15.02.2008. u 15:18 - pre 197 meseci
Interesantno, ali ja sam i dalje za navedeni pristup. BindignSource ne treba da bude thread safe, jer po meni ne bi trebao da manipulises podacima iz njega preko threada. On je spona izmedju sloja podataka/biznis logike i sloja aplikacije, te njoj i pripada. GUI threadovi su tu samo radi vizuelnog ugodjaja i trebaju da eventualno citaju podatke iz BindingSource-a, a worker threadovi da rade nad samim data container-om, odnosno unutar biznis logike.

My two cents
Citat:
Druga stvar koja je kriticna kod static promenljivih je njihov zivotni vek i zauzimanje memorije. One zauzimaju memoriju odmah nakon ucitavanja aplikacionog domena i automatski bivaju inicijalizovane na default vrednost njihovog tipa.

Nece ako je promenljiva refrence type, jer sta bi se desilo ako klasa nema default konstruktor, tj. konstruktor bez parametara ? Isti je zivotni vek static polja i non-static polja clanice klase od koje pocinje izvrsavanje aplikacije, tako da nece uticati na performanse po pitanju zauzimanja memorije.
 
Odgovor na temu

Bojan Komazec
Bojan Komazec

Član broj: 41269
Poruke: 11
193.192.33.*



Profil

icon Re: Dva toboze laka pitanja19.02.2008. u 16:07 - pre 196 meseci
Citat:
Predrag Glumac: Interesantno, ali ja sam i dalje za navedeni pristup. BindignSource ne treba da bude thread safe, jer po meni ne bi trebao da manipulises podacima iz njega preko threada. On je spona izmedju sloja podataka/biznis logike i sloja aplikacije, te njoj i pripada. GUI threadovi su tu samo radi vizuelnog ugodjaja i trebaju da eventualno citaju podatke iz BindingSource-a, a worker threadovi da rade nad samim data container-om, odnosno unutar biznis logike.


Pocetni uslov problema, kako ga je Mikelly postavio, jeste da postoji jedan BindingSource koji ce opsluzivati vise formi tj. vise kontrola istovremeno. I sam si pretpostavio da korisnik preko BindingSource-a zeli da menja podatke iz vise formi a ne samo da ih cita:

Citat:
Predrag Glumac: Da moze da menja iz razlicith delova koda, tj. formi. (...) ...racunam da covek zeli da u pod formama vidi nekakve child view-ove od trenutno selektovanih podataka sa glavne forme i da ih eventualno menja


Dakle, imas vise formi, svaka u svom thread-u, koje preko BindingSource-a imaju istovremeni pristup podacima. Upotrebom BindingSource-a ti neminovno dajes GUI thread-u moc da barata sa podacima. Naravno, velika je verovatnoca da ces u aplikaciji imati i worker thread-ove. Zamisli situaciju da worker thread vrsi neki sql upit i prolazi kroz sve redove u nekoj koloni u data source-u a da pritom imas neku npr. DataGridView u nekoj formi tako da korisnik moze da menja podatke ili cak da obrise redove. Prilikom izvrsavanja koda koji nije thread-safe, izvrsavanje moze da skace iz jednog u drugi thread u svakom momentu (na nivou mikroinstrukcija). Npr. u working threadu moze se zapoceti citanje polja u nekom redu, ta polja se mogu prikazivati u nekoj formi - preko BindingSource-a, i npr. tada se izvrsavanje prebaci na GUI thread u kome korisnik izbrise taj red - takodje preko BindingSource-a. Kada se izvrsavanje vrati na prethodni thread, doci ce do konflikta jer reda gde je zapoceto citanje vise nema. Zato svaki thread treba da "zakljuca" podatke (tj. njihov wrapper - BindingSource, koji nije sam po sebi thread safe) dok ne zavrsi rad sa njima. Otuda potreba da se napravi thread safe BindingSource.

Citat:
Predrag Glumac:
Nece ako je promenljiva refrence type, jer sta bi se desilo ako klasa nema default konstruktor, tj. konstruktor bez parametara ? Isti je zivotni vek static polja i non-static polja clanice klase od koje pocinje izvrsavanje aplikacije, tako da nece uticati na performanse po pitanju zauzimanja memorije.


Tvoja ideja je bila da static member bude u klasi forme, sto nije klasa od koje "pocinje izvrsavanje aplikacije". Sa "new" se mora prvo napraviti instanca forme. Ali cak i pre toga, kompajler bi zauzeo memoriju za static promenljivu (za smestanje reference) i inicijalizovao bi je na null (cak i ako nemas nikakav eksplicitno definisan konstruktor i ako ne koristis inicijalizaciju van konstruktora, pri deklaraciji). Moze joj se pristupiti bez instaciranja klase. Dakle, ona bi pocela da zivi pre pocetka zivota instance klase, a tako i non-static member-a.
 
Odgovor na temu

Mikelly

Član broj: 16730
Poruke: 389
77.222.5.*



Profil

icon Re: Dva toboze laka pitanja20.02.2008. u 08:53 - pre 196 meseci
Dobri ste, citajuci vase postove naucih i ja ponesto.

Ja sam se odlucio za pristup koji je komarabibt predlozio.
Na jednoj formi sam postavio DataSet, nekoliko bindingsource-ova, i napravio public propertyje koji vracaju te bindingsource-ove i public Fill i Update metode za odgovarajuce tabele.

To sto komarabbit prica o tread safe klasama me sad interesuje. Da li je ovo sto sam ja sad napravio thread safe? I kako se to "zakljucavaju" podaci?

Evo konkretno:
Svi bindingsourceovi su na pocetnoj formi.
Imam formu na kojoj pravim racune, a na racunima se nalaze artikli. Artikli su u zasebnoj tabeli, tako da imaju svoj bindingsource. U tabeli detalja racuna nalazi se strani kljuc iz tabele artikli.
Ako sad pravim neki racun, i tamo dodajem artikle, a onda bez zatvaranja te forme otvorim formu dje radim sa artiklima, i obrisem neki od njih koji se upravo nalazi na datom racunu, kako se to manifestuje?
 
Odgovor na temu

Bojan Komazec
Bojan Komazec

Član broj: 41269
Poruke: 11
193.192.33.*



Profil

icon Re: Dva toboze laka pitanja20.02.2008. u 18:31 - pre 196 meseci
Citat:
Mikelly: Dobri ste, citajuci vase postove naucih i ja ponesto.


Svi mi ovde ucimo...

Mikelly, ja sam predlozio malo drugaciji pristup od onog koji si ti ovde opisao. Evo agende:

1) napraviti thread safe BindingSource klasu. Neka se zove BindingSourceSync, gde "Sync" stoji za "synchronised" - u smislu sinhronizacije tredova

2) sve objekte za rad sa podacima (DataSet, BindingSource-ve, metode za rad sa DB...) staviti "pod istu kapu" - singleton klasu koju ce koristiti razlicite forme. Singleton klasu koristimo jer nam treba jedna i samo jedna instanca ove klase. Ovako razdvajamo sloj podataka od sloja prezentacije (GUI-ja). Ta klasa se moze zvati BindingSourceManager.

3) povezati kontrole sa razlicitih formi sa BindingSource-vima

4) definisati i implementirati akcije koje se izvrsavaju kada se iz GUI-ja menjaju podaci u DataSet-u


Evo i ideja za implementaciju:

1)
Citat:
Mikelly:
kako se to "zakljucavaju" podaci?


"zakljucavanje" podataka se odnosi na kontrolu pristupa podacima (memoriji sa podacima) kada joj istovremeno moze pristupati vise tredova. Poenta je da se jednom tredu onemoguci pristup podacima sve dok drugi tred ne izvrsi neku operaciju nad njima. Na internetu ima mnogo clanaka o ovom problemu a ja preporucujem ova dva:

http://www.albahari.com/threading/part2.html#_Synchronization_Essentials

http://msdn2.microsoft.com/en-us/library/yy12yx1f.aspx

U njima se moze procitati da je za pravljenje thread-safe klase neophodno imati sinhronizacioni objekat. Klasa BindingSource ima jedan clan koji se zove SyncRoot i cija namena je upravo da posluzi kao sinhronizacioni objekat. Evo kako bi otprilike trebalo da izgleda thread safe BindingSource klasa:

Code:

    public class BindingSourceSync : BindingSource
    {
        public override void Insert(int index, object value)
        {
            lock (SyncRoot)
            {
                base.Insert(index, value);
            }
        }

        public override void Remove(object value)
        {
            lock (SyncRoot)
            {
                base.Remove(value);
            }
        }

        // na slican nacin ovde treba override-ovati GetEnumerator, RemoveAt, Add, Clear, Count, IndexOf, operator []  
        // ...
        // ...
    }


2) Singleton je klasa koja je tako implementirana da je moguce napraviti jednu i samo jednu njenu instancu. Tajna je u private konstruktoru, u kom se proverava da li je instanca vec napravljena. (Implementacija singlton klase je jos jedan primer upotrebe sinhronizacije tredova)

Evo kako bi mogao da izgleda BindingSourceManager:

Code:

    public class BindingSourceManager
    {
        private static object _lockObj = new object();

        private static BindingSourceManager _instance;

        private BindingSourceSync _bindingSource;

        public BindingSourceSync GetBindingSource
        {
            get
            {
                return _bindingSource;
            }

            set
            {
                _bindingSource = value;
            }
        }       

        // ovo je data source (to moze biti i DataSet...bilo sta sto se kaci na bazu i popunjava podacima iz nje)
        private DataTable _dataTable;

        private BindingSourceManager()
        {
            // kreirati _dataTable
            // (...)
            // ovde (ili, jos bolje, u nekoj posebnoj metodi) popuniti _dataTable
            // (...)

            _bindingSource = new BindingSourceSync();
            _bindingSource.DataSource = _dataTable;
        }
       
        // singleton pattern
        public static BindingSourceManager GetInstance
        {
            get
            {
                lock (_lockObj)
                {
                    if (_instance == null)
                    {
                        _instance = new BindingSourceManager();
                    }

                    return _instance;
                }
            }
        }
    }
}


3) Sada ces u bilo kojoj formi u tvom projektu moci pristupati _bindingSource-u pozivom:

Code:

BindingSourceManager.GetInstance.GetBindingSource


Na primer:
Code:

this.dataGridView1.DataSource = BindingSourceManager.GetInstance.GetBindingSource;


4)
Citat:
Mikelly: Svi bindingsourceovi su na pocetnoj formi.
Imam formu na kojoj pravim racune, a na racunima se nalaze artikli. Artikli su u zasebnoj tabeli, tako da imaju svoj bindingsource. U tabeli detalja racuna nalazi se strani kljuc iz tabele artikli.
Ako sad pravim neki racun, i tamo dodajem artikle, a onda bez zatvaranja te forme otvorim formu dje radim sa artiklima, i obrisem neki od njih koji se upravo nalazi na datom racunu, kako se to manifestuje?


Ako u formi sa racunom za prikaz atributa artikala koristis drugaciji BindingSource od onog koji koristis u formi gde radis sa artiklima, nece doci ni do kakve promene jer razliciti BindingSource-vi barataju sa razlicitim kopijama podataka iz baze. Ako imamo liniju GUI kontrola - BindingSource - DataSet - DB, i ako iz kontrole nesto menjas/dodajes/brises u jednoj tabeli a sto moze uticati na stanje u nekoj drugoj tabeli, mozes ili proci kroz citav lanac i upisati novo stanje u DB, pa ici nazad i osveziti stanje u svim kontrolama, a mozes ici i samo do DataSet-a, pa tek kada se uveris da imas poravnate podatke, da ih upises u bazu.
 
Odgovor na temu

mmix
Miljan Mitrović
Profesorkin muz
Passau, Deutschland

SuperModerator
Član broj: 17944
Poruke: 6042



+4631 Profil

icon Re: Dva toboze laka pitanja22.02.2008. u 13:28 - pre 196 meseci
Ok, da ja dam par komentara na vasu pricu:

1. BindingSource nije thread safe, ali to i nije problem za njegov scenario sa formama jer sve forme rade pod istim thread-om bez obzira na to koliko ih ima. Problem nastaje samo ako se spawnuju worker threadovi koji bi radili sa tim sourcom.

2. Binding source je nezgrapan za resavanje race condition situacija, podaci se nece updatovati niti sinhronizovati sa ostalim biodovanim kontrolama dok god je binding source u edit modu. Efektivno ne postoji idealno resenje za race condition, mozes samo da hvatas eceptone koji mogu da nastanu tom situacijom i da saniras situaciju.

3. bindingsource.syncroot nije objekat za sinhronizaciju samog binding sorsa, njega lokujes kad hoces da lokujes podatke koji su ispod bindingsource-a, npr dataset na koji je nakacen. Ovim se zapravo osigurava da pristup datasetu bude vise thread safe, za slucaj da postoji drugi thread koji barata istim dataset-om preko drugog sourca-a ili direktno. Rezultat je na kraju isti u ovo scenariju, ali ovo je samo kao napomena sta se u stvari desava, i ako pravite taj thread safe wrapper, moras da lokujes ili this.syncRoot ili this SVUDA. Ako mesas i koristis oba, lako mozes da uletis u deadlock.

4. BindingSourceManager iz prethodnog posta ne resava problem. AKo pogledas kôd malo detaljnije videces da on ne cini da BindingManager bude thread-safe, on samo osigurava da dva thread-a ne mogu u isto vreme da uzmu "referencu" na bindingsource. Medjutim jednom kad dodju do reference bindingsource-a ne postoji mehanizam koji sinhronizuje pozive metodama te dve reference (koje pokazuju na istu instancu). Daklem, cela ta singleton implementacija zapravo ne postize zeljeni efekat. sorry.


Mislim da konceptualno pogresno gledate na to sta je BindingSource, on nije data access kontrola i mesto joj nije ni u data ni u business layer-u. Binding source je GUI kontrola, a dovoljan hint za to bi trebalo da vam bude cinjenica da se nalazi u System.Windows.Forms namespace-u a ne u System.Data. BindingSource nije "izvor podataka" on je "izvor bindinga", on ne manipulise podacima on se samo stara o sinhronizaciji izvora podataka na koji je nakacen i kontrola koje binduje, u kom smeru sinhronizacija ide (update controls ili update list) pritom koristeci CurrencyManager u pozadini da osigura trenuntu poziciju recorda u multi-record izvoru. To je fundamentalno SVE sto radi. Jednostavno ne postoji potreba za time da se isti BindingSource koristi za razlicite forme, koji god da je scenario postoji elegantnije resenje, jer multi-form binding sors moze da napravi mnogo vise problema nego sto donosi koristi, npr. ne mozes da koristis designer binding - sve mora kroz kôd, kad jedan forma prebaci source u edit mode - sve forme prelaze u edit mode, ako korisnike krene da edituje u dve forme i jedna forma zavrsi edit mode - zavrsava se i u drugoj sa nepredvidivim redosledom sinhronizacije dataset-a (ako je jedno polje bidnovano na dve kontrole na dva forma, iz koje kontrole/forme ce polje biti updatovano?), itd, itd.

E sad, ako pravis dve razlicite forme sa dva razlicita bindingsource-a nista te ne sprecava da bindingsource postavis na isti dataset. Iako ni sam dataset nije thread-safe (zapravo jeste za citanje opdataka, samo insert/update/delete bi morali da se sync-uju), on je bar monolitan i ne podleze problemima iz prethodnog paragrafa. A i za te operacije za koje nije thread-safe, pogledaj pod #1, dok god ti radis samo sa GUI thread-om nemas problema.




Citat:
Mikelly: Svi bindingsourceovi su na pocetnoj formi.
Imam formu na kojoj pravim racune, a na racunima se nalaze artikli. Artikli su u zasebnoj tabeli, tako da imaju svoj bindingsource. U tabeli detalja racuna nalazi se strani kljuc iz tabele artikli. Ako sad pravim neki racun, i tamo dodajem artikle, a onda bez zatvaranja te forme otvorim formu dje radim sa artiklima, i obrisem neki od njih koji se upravo nalazi na datom racunu, kako se to manifestuje?


Sta ce se desiti zavisi od dataset-a koji je ispod bindingsource-a tj kako si napravio relacije izmedju tabela detalja i artikala. Ako imas cascade delete, bice obrisan i detalj kad obrises artikal. Ako je relacija implementirana a ostane detalj a ode artikal puci ce ti exception pri brisanju jer bi brisanje artikla dovelo dataset u nereferentno stanje.
Sloba je za 12 godina promenio antropološki kod srpskog naroda. On je od jednog naroda koji je bio veseo, pomalo površan, od jednog naroda koji je bio znatiželjan, koji je voleo da vidi, da putuje, da upozna,
od naroda koji je bio kosmopolitski napravio narod koji je namršten, mrzovoljan, sumnjicav, zaplašen, narod koji se stalno nešto žali, kome je stalno neko kriv… - Z.Đinđić
 
Odgovor na temu

Mikelly

Član broj: 16730
Poruke: 389
85.94.121.*



Profil

icon Re: Dva toboze laka pitanja23.02.2008. u 17:19 - pre 196 meseci
Citat:

mmix: multi-form binding sors moze da napravi mnogo vise problema nego sto donosi koristi, npr. ne mozes da koristis designer binding - sve mora kroz kôd


E, to sam i ja primijetio. Ali sto sam jos primijetio je da se designer moze koristiti samo ako su bindingsource i dataset na istoj formi. Ako napravim bindingsource koji se kaci na dataset koji se nalazi na nekoj drugoj formi, designer opet ne radi.

Moj pocetni cilj je bio samo da centralizujem pristup podacima. Npr. bindingsource tabele artikli mi je potreban na formi koja ce raditi unos i pregled samih artikala, ali isto mi je tako potreban na formama izlaznih i ulaznih racuna, jer se na racunima nalaze artikli, pa radim autolookup. Takodje, bindingsource kupaca i dobavljaca mi je potreban na dvije forme.

Onda mi je bilo bzvz da na svakoj formi pravim novi bindingsource i novi dataset, jer mi bez tog dataseta ionako ne radi designer, tako da sam odlucio da na pocetnoj formi napravim jedan jedini dataset, i public propertyje i metode za pristup bindingsourcevima i update i fill metodama table adaptera.

Ne znam jesam li napravi kakav boljitak sto se tice sigurnosti ili performansi, ali ono sto je sigurno je da sam ja nacisto dje su mi podaci i nekako mi je lakse da se snadjem u toj gomili bindingsourceva...

Pozdrav.
 
Odgovor na temu

mmix
Miljan Mitrović
Profesorkin muz
Passau, Deutschland

SuperModerator
Član broj: 17944
Poruke: 6042



+4631 Profil

icon Re: Dva toboze laka pitanja25.02.2008. u 14:55 - pre 196 meseci
Citat:
Mikelly: E, to sam i ja primijetio. Ali sto sam jos primijetio je da se designer moze koristiti samo ako su bindingsource i dataset na istoj formi. Ako napravim bindingsource koji se kaci na dataset koji se nalazi na nekoj drugoj formi, designer opet ne radi.

Tu su malo zeznuli stvar. Sam BindingSource je prilicno mocan i njegov DataSource ne mora da bude dataset, moze da bude type dataset-a, i da se onda urade svi bindinzi i na kraju kad imas pravi dataset samo ga ubacis u DataSource bez da poremetis postojece Bindinge. Medjutim kao i dosta drugih dobrih fora, momci iz redmonda su bili malo lenji da to implementiraju pa je iz designera moguce samo vezati DataSource na instancu, ne na tip.

Medjutim, postoji workaround za to, na formi se napravi dummy instanca dataseta iz designer-a cisto da sluzi kao nosioc type informacija i binding source se zakaci na njega da bi design time binding radio. Posle se iz koda po inicijalizaciji forme BindingSource.DataSource zameni sa pravom instancom kesiranog dataset-a iz biznis layera i sve radi ok. Fora je sto pri promeni DataSource propertija BindingSource zadrzava sve one bindinge koji postoje i u starom i u novom DataSource-u.

Citat:
Moj pocetni cilj je bio samo da centralizujem pristup podacima. Npr. bindingsource tabele artikli mi je potreban na formi koja ce raditi unos i pregled samih artikala, ali isto mi je tako potreban na formama izlaznih i ulaznih racuna, jer se na racunima nalaze artikli, pa radim autolookup. Takodje, bindingsource kupaca i dobavljaca mi je potreban na dvije forme.

Centralizacija, sto rece, je moguca preko detached dataset objekata u biznis layer-u. Ne bi trebalo da ide preko binding sourceva, niti bi trebao da tretiras formu kao business layer objekat koji ih servira. Pre ili kasnije ce te kompleksnost aplikacije naterati da sve ovo radis iz pocetka. Veruj mi, vidjao sam ovo i ranije, kad dodje validacija, pa kad dodje "moranje" da se isti data objekat edituje na dve ili vise formi, napravices aplikaciju koja ce biti nocna mora za korisnike.

Sloba je za 12 godina promenio antropološki kod srpskog naroda. On je od jednog naroda koji je bio veseo, pomalo površan, od jednog naroda koji je bio znatiželjan, koji je voleo da vidi, da putuje, da upozna,
od naroda koji je bio kosmopolitski napravio narod koji je namršten, mrzovoljan, sumnjicav, zaplašen, narod koji se stalno nešto žali, kome je stalno neko kriv… - Z.Đinđić
 
Odgovor na temu

mmix
Miljan Mitrović
Profesorkin muz
Passau, Deutschland

SuperModerator
Član broj: 17944
Poruke: 6042



+4631 Profil

icon Re: Dva toboze laka pitanja25.02.2008. u 15:07 - pre 196 meseci
Ok, moram da se ispravim za lenjost momaka iz Redmonda, stvar je resena u VS 2008 Fora je u "project data source".

Znaci kad se otvori "DataSource" dropdown iz binding source-a prvi put izabere se "Add new data source" a kao tip data source-a izabere se "Object". Sledeci korak je u listi pronaci dataset klasu i istu izabrati.

Posle ovoga binding source vise nije vezan na instancu dataseta vec na tip dataset-a i dizajner radi bez dataseta na formi (bindovah textbox1.text):

Code:

        private void InitializeComponent()
        {
            this.components = new System.ComponentModel.Container();
            this.bindingSource1 = new System.Windows.Forms.BindingSource(this.components);
            this.textBox1 = new System.Windows.Forms.TextBox();
            ((System.ComponentModel.ISupportInitialize)(this.bindingSource1)).BeginInit();
            this.SuspendLayout();
            // 
            // bindingSource1
            // 
            this.bindingSource1.DataMember = "mytable001";
            this.bindingSource1.DataSource = typeof(WindowsApplication2008.mydataset);
            // 
            // textBox1
            // 
            this.textBox1.DataBindings.Add(new System.Windows.Forms.Binding(
                        "Text", this.bindingSource1, "mycol001001", true, 
                        System.Windows.Forms.DataSourceUpdateMode.OnPropertyChanged));
            ...


Jos bolje, taj data source je sad na raspolaganju celom projektu i sve ostale forme mogu da imaju svoje binding sourceve koji pokazuju na ovaj tip.

Znaci, vise nema ni te jedne jedine potrebe za sherovanjem binding sourceva preko formi
Sloba je za 12 godina promenio antropološki kod srpskog naroda. On je od jednog naroda koji je bio veseo, pomalo površan, od jednog naroda koji je bio znatiželjan, koji je voleo da vidi, da putuje, da upozna,
od naroda koji je bio kosmopolitski napravio narod koji je namršten, mrzovoljan, sumnjicav, zaplašen, narod koji se stalno nešto žali, kome je stalno neko kriv… - Z.Đinđić
 
Odgovor na temu

Mikelly

Član broj: 16730
Poruke: 389
212.200.246.*



Profil

icon Re: Dva toboze laka pitanja26.02.2008. u 19:13 - pre 196 meseci
E vjeruj mi da upravo koristim workaround kao i ti. To mi nekako samo doslo, ali mi izgledalo kao "lame" rjesenje, pa nijesam pominja. Ono sto je bitno, pomaze.
A kako to mislis detached dataset? Dje je, kad nije ni na jednoj formi?
 
Odgovor na temu

mmix
Miljan Mitrović
Profesorkin muz
Passau, Deutschland

SuperModerator
Član broj: 17944
Poruke: 6042



+4631 Profil

icon Re: Dva toboze laka pitanja26.02.2008. u 20:00 - pre 196 meseci
Detached dataset je dataset objekat u koji su ucitani realni podaci i koji vise nisu u direktnoj vezi sa podacima iz baze (kesirani su). Upotrebio sam mali oxymoron posto su u principu svi datasetovi detached kad ucitaju podatke. Trenutno ne postoji dataset klasa koja odrzava aktivni cursor nad bazom.

Postoje razni metodi za kesiranje dataset-ova, najjednostavniji je da iskoristis varijaciju konstrukcije koju ti je dao komarabbit i napravis singleton koji ce drzati instancu dataseta koji svuda setas, u krajnjoj liniji napravis BL kalsu gde ce dataseti biti public static. ali to nije jedino resenje, mozes da proguglas za "caching winforms data", neki likovi cak koriste Cache kalsu iz ASP.NET-a u WInforms aplikacijama

Ja u principu nikad ne kesiram podatke u winforms aplikacijama sem u dva slucaja: liste itema za dropdown kontrole i podaci koji se retko menjaju a dugo traju da se pribave. Kad pogledas sve ostale primene, npr tvoja lista artikala, cak i da ucitas iznova artikle svaki put kad se otvori forma artikala neces napraviti nikakav znacajan pritisak na bazu, a resices se problema zastarelosti podataka (ako je npr operater B dodao novi artikal a ti pokusavas da ga prodas koristeci zastarelu tabelu).



Sloba je za 12 godina promenio antropološki kod srpskog naroda. On je od jednog naroda koji je bio veseo, pomalo površan, od jednog naroda koji je bio znatiželjan, koji je voleo da vidi, da putuje, da upozna,
od naroda koji je bio kosmopolitski napravio narod koji je namršten, mrzovoljan, sumnjicav, zaplašen, narod koji se stalno nešto žali, kome je stalno neko kriv… - Z.Đinđić
 
Odgovor na temu

[es] :: .NET :: Dva toboze laka pitanja

[ Pregleda: 3672 | Odgovora: 19 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.