Kako iz Form3 preneti string u Form1 (VS2015)

Radomi Mihajlovic

Zainteresovan član
Poruka
104
Imam 3 forme, Form1 poziva ili prikazuje Form2 a ova Form3. U Form1 imam textBox1 u koji zelim da prikazem neki teks koji je formiram u Form3, recimo "zdravo". Iz Form3 da se prikaze u Form1.textBox1. Ili da neki sring iz Form3 prenesem u Form1, nije problem da iz Form1 prenesem sring u Form3.Ovako prenosim iz Form1 u Form3 recimo string ali ne radi obrnuto. Hvala
 
Ne znam taj framework ali GUI je obicno baziran na event loop-u. To znaci da se pozivaju event handleri za nesto. Znaci ti verovatno u event handleru za nesto u formi1 setujes tekst u formi3. E sad ti hoces da u event handleru za nesto u formi3 da setujes tekst u formi1? Znaci da u formi3 moras imati referencu na formu1 ukoliko je parametar koji primas u datom event handleru forma1. Obicno se prilikom uspostavljanja veze objekt-handling funkcija moze dati dodatni parametar na user data i tu ti je prilika da kod setovanja konekcije object-handling funcija prosledis formu1. Sve je to na isti kalup, tako da verujem da mozes to izvesti u svom frameworku.

edit:
Ima jezika koji imaju closure pa nije potreban dodatni parametar za user data, zato sto closure-i sami po sebi zarobljavaju kontekst u kom su kreirani.

edit2:
naravno postoji mogucnost da izvedes svoju formu iz forme koja bi imala referencu na formu, pa onda prosledis u konstruktoru, pod uslovom da je event handler metod a ne free f-ja.
 
Poslednja izmena:
Kao sto sam ti vec pisao, u korenu postavljas stvari pogresno, zato i nailzais na takve probleme.

Nikada, ali nikada se ne implementira tako da jedna forma otvara drugu koja otvara trecu.

Konkretan tvoj problem se resava preko takozvanih owner-a (forma1 je owner forme2, koja je owner forme3, itd....), ali opet, to je narusavanje elementarnih principa OOP-a. TAKO SE NE RADI.

Moras da potpuno sve zaboravis, i da iz pocetka projektujes svoje resenje.

Totalno mi je bez veze da ti sada objasnjavam kako da resis nesto sto se ni ne postavlja tako, kamoli resava....
 
naravno postoji mogucnost da izvedes svoju formu iz forme koja bi imala referencu na formu, pa onda prosledis u konstruktoru, pod uslovom da je event handler metod a ne free f-ja.

U C# jeziku, svaka promenljiva je objekat, a ne postoji razlika izmedju metode i funkcije. Takodje, svaki objekat ima svog owner-a koji se moze definisati i kojem se moze pristupiti direktno iz deteta, tako da je resenje ovog problema vrlo prosto.

Medjutim, ovde je problem, sto postoje neka pravila kako se projektuje softver u C# jeziku, a ovo je skolski primer kako ne treba da se radi.

Rad sam da pomognem, ali necu da ucim nikoga pogresno.
 
Nikada ne treba da se postavi tako da jedna forma otvara drugu, koja otvara trecu.
Ni u jednoj implementaciji nicega, ni u cemu!
Kakav je to User Experience design, pobogu?!?!

Ne mogu da objasnim dok ne cujem ceo scenario, sta treba da se implementira, pa cu onda da odgovorim i kako.
A to, da iz forme3, otvorene preko forme2, koja je otvorena iz forme1, vrati podatak u formu1, to je toliko pogresan pristup (da ne upotrebim neku tezu rec), da je besmisleno resavati.
 
Moj problem je što ja skoro 30 godina bavim se linearnim programiranjem, počeinjem da shvatam OP ali treba mi još dosta vremena. Ponavljam imam komplet programe za poslovanje firmi napisane u cliperu 5.3 (finansijsko poslovanje, robno, osnovna sredstva, zarade, blagajne, štamparije i dr i sve je radilko u mreži). Sada hoću da sve to prevedem na MySql i C# uz primenu VS2015. Konkretno kada se knjiži nalog glavne knjige početna maska je Form1 koja može da pozove Form2 (u ovoj formi prihvata se izvod iz banke u pdf formatu, koji treba da se prenese upiše u tabelu izvod koja ima entitete kao što su broj naloga, datum naloga, račun uplatioca, naziv uplatioca..) Sada entitete tabela izvod treba prikazati u form2 da bi knjigovodja nešto promenio a zatim svaku stavku da upiše u tabelu nalog, pritom treba da se ažuriraju tabele otvorene stavke, zaglavlje naloga, knjniga ulaznih računa, knjiga izlaznih računa.. Da bi sav ovaj proces bio brz i nevidljiv za korisnika potrebno je neke podatke držati u promenljivim ja to pokušavam da čuvam u STATIC i da ih po potrebi prikažem u Form1 ili Form2 a koji su nastali u Form3. Eto . Kako bi trebalo ?
 
Ne kapiram iz opisanog, gde je tu Form3, i zasto ti je potreban, uopste, Form3?

Kako bi bolje shvatio o cemu pricam, evo malo o samom OOP-u:
Kod OOP-a, postoje dva elementarna principa koja moras da ispostujes:
1. High Cohesion (jaka kohezija -> odnosi se na jaku povezanost unutar klase): znaci da klasa treba da radi samo jednu stvar, i to da je radi vrlo dobro. To je, takozvani, princip jedne odgovornosti. Jedna klasa (objekat) je odgovorna za jedan jedinicni posao koji treba da se uradi.
2. Low coupling: labava povezanost izmedju samih klasa: znaci da klasa mora da sto manje zavisi od drugih klasa.

Kreiranjem takve strukture, gde Form1 poziva Form2, a Form2 poziva Form3, i sada treba da podatke sa Form3 prebacimo na Form1, narusavamo ove elementarne principe.

Pokusaj da osmislis drugacije resenje.
Recimo, da Form2 i Form3 implementiras kao dijalog, koji bi imao vise "stranica", i gde bi, po principu, "Next -> Next -> Finish" odradio to sto treba da odradis (koliko kapiram, treba da pripremis podatke pre nego ih uneses u bazu).
Time bi sve podatke, koje pripremas za upis u bazu, spakovao u jednu jedinu klasu, koja bi ti bila dostupna na tom dijalogu (sam dijalog je, takodje, windows form - jedna jedina klasa koja ce odraditi svu pripremu podataka). Ovime bismo ispostovali prvi princip (High Cohesion).

A sada, da ispostujemo i drugi princip (Low Coupling):
Koliko kapiram, Form1 ti je glavni view.
Kako bi ispostovao ove principe OOP-a, ti neces iz Forme2 prebaciti podatke u Formu1, vec ces iz Forme2 ubaciti podatke u Bazu, a onda ces nakon sto Forma2 zavrsi svoj posao, uraditi Refresh citanja podataka u Formi1, i onda ces u Formi1 imati azurne podatke.

Nadam se da ce ovo da pomogne, jer tako se radi.
Ako napravis neku drugu implementaciju, ocekuj velike bagove i nestabilnost u radu, a o samom kasnijem odrzavanju koda, da ne govorim.
 
Možeš preko delegatea.


A možeš i preko full propertya. Ovako:

U formi 1 kucaj "propfull" i onda dvaput pritisni dugme Tab na tastaturu. To će napraviti getere i setere. I umjesto int promjeni u static string i naziv koji hoćeš npr. mojTekst.

U trećoj formu recimo tamo gdje okidaš promjenu npr dugme na clicku tu stavi Form1.MojTekst = "zdravo ili šta već hoćeš"

I još jedna stvar u formi 1, nađi u Properties pa Events (onaj znak groma) stvar Activated. To duplim klikom prebaci u kod, i stavi txtBox.Text = mojTekst

Samo nadam se da forme pozivaš sa ShowDialog....

:)

To je to. Lp.
 
Forma3 služi da operater izabere banku i izvod koji želi da prevede iz pdf u stringove koji se upisuju u tabelu izvod, kada se ovo završi vraća se u formu2 radi obrade svake stavke ponosob.
Što se tiče klasa ok zato sam formirao form3 i form2. Dobro nisam znao da se ovako naručavaju principi OP.
Tako je prvo pripremam podatke a zatim u forma2 dajem knjigovođi da ih on obradi i upiše u bazu. Takve obrađene podatke pakujem (u klasu) u kojoj je dataGrid.
Da form1 je glavni view. U form1 ja čitam pdf izvod i podatke upisujem u dataGrid kada se ovaj proces završi vračam se u form2 gde sada knjigovođa svaki podatak dodatno obradi izmeni, dopuni i zatim upisuje u tabelu nalog. Ne u form2 sve se završava a form1 je samo neki uvodni view gde se prikazuju samo brojevi naloga.
evo primera kako pozivam iz form1 formu2 a zatim formu3.
Pitanje je kako bi implementirao dijalog koji ima više stranica. Kupio sam knjigu C# Entety Framework with VS2015, ali tamo nema toga vrlo je početno opisano sve .
 
Ne mogu da te ispratim bas najbolje, ali ono sto kontam je da nisi nista postavio kako treba.
Procitaj sve sto mozes prvo o mvvm projektnom obascu i ispostuj ga u svom projektu.

Sto se tice implementacije forme koja ce raditi ponorincipu next-> next-> finish, vrlo prosto: vise panela, preklopljenih, kojima samo menjas visibility property pritiskom na dugme.
Ali i to mora da se implementira drzeci se projektnog obrasca "state".
Vidi, ne bih da te obeshrabrim, ali mnogo toga moras jos da naucis da bi mogao da koristis OOP kako treba.
Ako zelis dobar softver da pravis, poslusaj me, prouci dobro projektne obrasce.
I uvek postuj principe OOP-a.
 
Hvala ti prijatelju. Ja sam bio odsutan neko vreme. Sa zakasnjenjem zelim ti srecnu novu sve najbolje.
Primenio sam tvoj savet dao je rezultat. Ali postoji problem sto se text pojavi tek kada kliklnem na textBox1 u Form2, a bi hteo da se poruka pojavi bez da kliknem.
ovo je Form2 > a u (munja) Activated postavio sam Meni_Activated
// za povratni prenmos podataka iz dete meni u roditelj meni
public static string wnazivposlameni;
public static string MyProperty
{
get { return wnazivposlameni; }
set { wnazivposlameni = value; }
}
// kraj
private void Meni_Activated(object sender, EventArgs e)
{
textBox1.Text = wnazivposlameni;
}
ovde pozivam Form knjnaloga
KNJNALOGA knjnalogaShow = new KNJNALOGA();
knjnalogaShow.Show();

A u Formi knjnaloga postavio sam ovo
private void prikazbrnal()
{
Form2.wnazivposlameni = "KNJIŽENJE NALOGA";
 
Frederik, pa Form1 Form2 Form3 .... o cemu pricati u vezi toga ;)
Covek jednostavno nece da ulazi u problematiku, ocigledno koristi generator za UI, i samo bi da popuni event handlere i tera ;)

Pa to kontam, ali kontam i da je nesto naucio iz gornjih postova. Ne zelim da resavam problem onako kako se ne resava. "Hoce da izlije u broznu ili nece, ako nece, cu da rasturam, da ne' da radim." :)
 
Uopste ne koristim generator. Vec Formme za svaki pojedinacni program ili modul. ako se razume te u knjigovodstvo onda je Form2 sluzi za knjizenje naloga glavne knjige dok form3 za knjizenje kupaca i dobavljaca, a so nemam mikakve veze sa ovim sto vi pricate. Mozda je kod nerazumljiv jer je samo deo koda a ne cele forme.Ako ste me pratili od pocetka onda vam je sve jasno u suprotnom ne solite pamep meni koji se bavim skoro 30 god programiranjem.
Hvala Leone i si mi bas puno i to konkretno pomogao a meni je takva pomoc potrebna.
Hvala
 
Uopste ne koristim generator. Vec Formme za svaki pojedinacni program ili modul. ako se razume te u knjigovodstvo onda je Form2 sluzi za knjizenje naloga glavne knjige dok form3 za knjizenje kupaca i dobavljaca, a so nemam mikakve veze sa ovim sto vi pricate. Mozda je kod nerazumljiv jer je samo deo koda a ne cele forme.Ako ste me pratili od pocetka onda vam je sve jasno u suprotnom ne solite pamep meni koji se bavim skoro 30 god programiranjem.
Hvala Leone i si mi bas puno i to konkretno pomogao a meni je takva pomoc potrebna.
Hvala

Pa da se 30 godina bavis programiranjem, do sada bi naucio elementarne stvari u vezi OOP-a, jer OOP postoji vrlo aktivno skoro 25 godina.
I shvati da se 99.99% developera ne bavi knjigovodstvom.
Kod ti je veoma nejasan, a samim tim i pitanje.

Sta su "Formme"? Sta podrazumevas pod programom ili modulom? Svakome ko je jednom u zivotu koristio Visual Studio, jasno je da su Form2 i Form3 genericka imena za novokreirane forme. Ako postoje homonimi u knjigovodstvu za neke knjigovodstvene obrasce/formulare, onda to moras da napomenes kada formulises pitanje.

I niko ti ne soli pamet. Ako dobronamerne savete ljudi sa prilicnim iskustvom u komercijalnom softveru (ali i u nastavi - dakle neko ko je stotine studenata naucio da programiraju) koji pokusavaju da ti rese problem onako kako se resava (a ne onako kako ti zelis da bude resen), shvatas kao "soljenje pameti", onda imas veliki problem sa svojom profesionalnom sujetom.

Nije mi jasno, zasto pokusavas da programiras u objektno orijentisanom programskom jeziku, a nisi naucio prvo objektno orijentisano programiranje? I uporno odbijas da naucis, da bar shvatis osnovne principe koje ti ovde ponavljam kroz sve teme.

Da ti banalizujem, to je isto kao da vozac koji zna da vozi samo motorcikl misli da moze da uspesno i bezbedno vozi kamion sa prikolicom, ukupne tezine 30 tona, a da nije ni prosao obuku.

Najdobronamerniji savet koji ces da dobijes ovde ti je sledeci: potrosi nekoliko nedelja, savladaj osnove OOP-a, nauci osnovne pojmove i principe, i veruj mi, resenje ce ti se samo ukazati. A onda, mozemo da diskutujemo o naprednijim opcijama tog resenja.
 

Back
Top