» Poradna » Programy

C# - ako sa odkazat na komponentu z druheho formulara

 |   | 

Mam projekt s dvoma formularmi. A v istom momente potrebujem v kode prveho formulara zistit obsah nejakej komponenty, konkretne typu TextBox, ktora je na druhom fomulara.
Skratka ako sa dostat na komponenty ineho formu?
Nieco take, ako v delphi bolo pridanie nazvu unitu do uses a potom som sa mohol kdekolvek v tom druhom unite odkazat na komponenty z prveho.

Mohlo by vás také zajímat

Odpovědi na otázku

 |   | 

Pri vytvareni druheho formular predej prvni formular jako parametr konstruktoru.

Souhlasím  |  Nesouhlasím  |  Odpovědět
 |   | 

Nejak takto som to skusal, nie presne, ale ma to nevyhodu, ze mi to vracia hodnoty z toho TextBox-u ake boli v dobe spustenia, teda ake som nastavil pri dizajnovani a nie ake su v momente prace v spustenom programe.

Takisto neviem, ci by touto metodou (ako radis) islo nieco taketo - odkazovat sa na komponenty z druheho formulara na prvom, ale zaroven sa odkazovat na komponenty z prveho formulara na druhom.

Souhlasím  |  Nesouhlasím  |  Odpovědět
 |   | 

Ted jsem to zkousel vraci to soucasne hodnoty.
A odkazovat se z prvniho formulare na druhy muzes snad vzdycky. Teda pokud vytvaris druhy z prvniho.

Souhlasím  |  Nesouhlasím  |  Odpovědět
 |   | 

Na "komponentu" nemozes odkazat nijako, lebo po slovensky je KOMPONENT, nie KOMPONENTA!

Souhlasím  |  Nesouhlasím  |  Odpovědět
 |   | 

toje ale blbost

Souhlasím  |  Nesouhlasím  |  Odpovědět
 |   | 

nejde o komponent z raketoplanu, ale o malou softwerovou soucastku !

v cestine a verim ze i v SJ maji oba vyrazy sve uplatneni - "komponent" i "komponenta" !!

A jeste neco... vis kdo udela ze sebe nejvetsiho blbce? a na internetu prilis casty ukaz? ten kdo poukazuje na chybu druheho a sam naseka jeste vetsi paskvil.

Souhlasím  |  Nesouhlasím  |  Odpovědět
 |   | 

Typicka demencia na internete. Niekto uvedie pravdivy fakt a vzdy sa najde nejaky dement, ktory bez toho aby otvoril obycajny internetovy slovnik zacne s frazami "ja si myslim" a pod. A este vytiahne nejake uplne dementny argument, v tomto pripade, ze nejde o komponent z raketoplanu - z hladiska jazykoveho je aky rozdiel medzi velkou HW suciastkou a malou SW suciastkou? ZIADNY. KOMPONENT. Toho este vacsieho blbca si prave tymto urobil zo seba ty sam. Vid odkazy:


slovnik.juls.savba.sk ...

slovnik.juls.savba.sk ...


FYI: Su to stranky Jazykovedneho ustavu Ludovita Stura.



To je neuveritelne, raz za cas sa objavi na internete fakticky a korektny poznatok/poznamka a hned sa najde debilko s prazdnymi frazami. Sucastou procesu pripojenia k internetu by mal byt IQ test a povolovat by mali len ludi nad 130. Lebo takychto picmulinkov sa inak nezbavime.

Souhlasím  |  Nesouhlasím  |  Odpovědět
 |   | 

A mimochodom, ak by ti nebodaj napadlo zautocit na vecnu stranku - ze som autorovi neporadil - tu su akekolvek rady zbytocne. Taketo smiesne rady s public-ovanim clenov tried su dobre tak pre ZS, kde ich zacnu ucit z nuly rovno Javu a decka potom s tym bojuju. Akoze principy OOP, okrem ineho zapuzdrenost nic. Ale to by chcelo aj trochu porozmyslat nad navrhom, resp. si skusit nieco nastudovat, nielen sa naucit prdnut tlacidlo na form a tvarit sa ako majster sveta, ktory dokazal vytvorit stupid Hello World app. Ale ved studovat najskor proceduralne, potom algoritmy a datove struktury, a az potom OOP A SUCASNE navrhove vzory je pomale, naucim sa prdnut textfield a bezim pracovat!

Souhlasím  |  Nesouhlasím  |  Odpovědět
 |   | 

Tak neviem...
Mozete sem teda niekto hodit vzorku kodu, vsetko, co treba zadat aby som sa v druhom unite dostal ku komponentOM z prveho?
Dik

Souhlasím  |  Nesouhlasím  |  Odpovědět
 |   | 

vytvor si dva formy
Form1 a Form2
na Form2 si dej TextBox a nastav mu Modifiers na Public.
na Form1 dej button a poklikej na nem

pak udelas do vznikle metody na buttonu tohle:

private void button1_Click(object sender, EventArgs e)
{
Form2 f = new Form2();
f.textBox1.Text = "muj text";
f.ShowDialog();
}

a je to

Souhlasím  |  Nesouhlasím  |  Odpovědět
 |   | 

Rekneme, ze z prvniho formulare vyvolavas druhy formular. Takze:
Formular2 formular2 = new Formular2(this);

A ten Formular2 vypada nejak nasledovne:
class Formular2{
Formular1 formular1;
//konstruktor
Formular2 (Formular1 formular1){
this.formular1 = formular1;}

//nejaka metoda
public String coJeNaPrvnimFormulari(){
String textZprvnihoFormulare = formular1.textField.getText();
return textZprvnihoFormulare;
}

Akorat je to Java, ale vzhledem k tomu, ze C# je jen spatne vykradena Java, tak to bude snad podobne

Souhlasím  |  Nesouhlasím  |  Odpovědět
 |   | 

C# neni spatne vykradena java, DIKY BOHU !!!!! jeste to tak....
C# je dobre vykradena Delphi, taky architekturu delali lide z Borlandu !!! (fakt)

Souhlasím  |  Nesouhlasím  |  Odpovědět
 |   | 

Ja jsem Javista a kdyz jsem musel neco udelat v C#, tak jsem akorat misto import psal using a par podobnych veci a jinak jsem vubec neresil, ze se jedna o "jiny" jazyk. C# ma rozhodne mnohem bliz k Jave, nez k Delphi(Pascalu).

Souhlasím  |  Nesouhlasím  |  Odpovědět
 |   | 

Já jsem zase .NETista (to už je jedno kterýho konkrétního jazyka), který byl nucen psát v Javě.
Může se zdát, že C# se liší od javy jen v jiných názvech ale těch rozdílů je mnohem mnohem víc v čem jsou odlišné tyto dva jazyky.
Jediné co je spojuje je princip fungování a rádoby C-like snytaxe, kterou si každej ale rozšířil po svém. C# je spoustu syntax sugaru, zatímco java má miliony a milióny knihoven na jednu věc :) - To někomu může připadat jako výhoda, ale pro člověka, který se v tom nevyzná je to doslova peklo. Každopádně buďme rádi za konkurenci, aspoň se snaží obě partaje být lepší :)

Souhlasím  |  Nesouhlasím  |  Odpovědět
 |   | 

Takze co som skusal:
- nastavenie tej vlastnosti Modifiers na public mi aspon spristupnilo tu komponentu v kode druheho formulara. takze aj to je pomoc, dik.
Ale...
skusal som to nasledovne a nefunguje mi to korektne:
1. na prvom forme mam textbox a tlacitko, ktore ma na stlacenie takyto kod:
private void button_1_Click(object sender, EventArgs e)
{
MessageBox.Show("1-" + textBox_AZS_ReferenceNumber.Text);
Form2 form_2 = new Form2();
form_2.uloz();
MessageBox.Show("4-" + textBox_AZS_ReferenceNumber.Text);
}

2. kod procedury form_2.uloz na druhom forme je:
public void ulozl()
{
Form_main form_1 = new Form_main();
MessageBox.Show("2-" + form_1.textBox_AZS_ReferenceNumber.Text);
form_1.textBox_AZS_ReferenceNumber.Text = "542865lkjhg";
MessageBox.Show("3-" + form_1.textBox_AZS_ReferenceNumber.Text);
}

3. dalej pri dizajne obsahuje form_1.textBox_AZS_ReferenceNumber hodnotu "123". po spusteni upravim tuto hodnotu na trebars "123abc". vysledkom su tieto hlasky:
"1-123abc"
"2-123"
"3-542865lkjhg"
"4-123abc"

4. nasledne je obsah komponenty textbox na prvom forme "123abc"

Bude to asi tak, ze prikaz Form_main form_1 = new Form_main(); vytvori vlastne novy objekt (sice presne podla povodneho formu, ale predsa len je to novy/iny objekt) podla povodneho formu a v nom meni hodnoty v textbox-e. povodny form a komponenty na nom ostavaju nezmenene. ale prave toto by som ja potreboval. citat(resp. zapisovat) hodnoty z(do) komponent na originalnom forme.

Souhlasím  |  Nesouhlasím  |  Odpovědět
 |   | 

No konecne som pochopil o co ti ide ... ufff to bolo tazke. mas to uplne zle :)

Bud si posli referenciu toho main formularu do metody uloz, alebo si posli len referenciu na ten text, nemozes vytvarat novu instanciu formulara main. to je jasne ze sa ti to potom na tom povodnom nezmeni.

cize metoda uloz bude vyzerat asi takto:
public void uloz(ref string textiNaPrepisanie)
{
textNaPrepisanie = "bla bla";
}

potom tu metodu uloz zavolas takto

button_1_Click(object sender, EventArgs e)
{
Form2 form_2 = new Form2();
form_2.uloz(ref this.textBox_AZS_ReferenceNumber.Text);
}

no hadam toto uz pomoze....

Souhlasím  |  Nesouhlasím  |  Odpovědět
 |   | 

no hej, takto by to slo... nejak som pozabudol na prikaz ref.
ale aj tak to nie je presne ono. podarilo sa mi to urobit tak, ze ako parameter predavam rovno triedu/komponentu textbox, ale... co ak potrebujem posielat aj obsahy komponent inych tried (datetimepicker a pod.)?

No nic, dufal som ze to pojde jednoduchsie - a to tak, ze proste uz pocas kodovania mozem v druhom unite nakodovat zapis/citanie komponent na prvom forme priamo.
T.j. ako som pisal, ze v delphi sa dalo do uses nazov druheho unitu a potom som v kode kludne odkazoval no hocico z toho druheho formu.

Souhlasím  |  Nesouhlasím  |  Odpovědět
 |   | 

Tak, jak je to v Delphi, to proste nepujde.

Souhlasím  |  Nesouhlasím  |  Odpovědět
 |   | 

no to sa da tiez, tak si posli cely form, ako ti uz niekto predtym pisal. Pristupovat ku komponentom toho formu mozes potom cez property ktore si sam napises, alebo zmenis pristup na tie komponenty z private na public, ale radsej vyuzi tie property (get, set).

cize vo Form2 si vytvor konstruktor ktory bude ako param prijimat referenciu na ten tvoj main form.

public class Form2 : Form
{
private Form_Main mainFrm;
public Form2(Form_Main manFrm)
{
this.mainFrm = mainFrm;
...
}
}

a potom na tej main formicke vytvoris instanciu Form2 takto

Form2 frm2 = new Form2(this);

potom mozes na formicke Form2 pristupovat k vsetkym public veciam cez mainFrm.

to je asi tak vsetko.

Souhlasím  |  Nesouhlasím  |  Odpovědět
 |   | 

Vyborne vyborne... dik...
Je to to co som potreboval, dostanem sa ku komponentam z prveho formu na druhom.

Skomplikujme to ale este viac: mam aplikaciu s niekolkymi formami (dajme tomu aj niekolko desiatok). A medzi nimi mam jeden form kde mam nastavenia pre celu aplikaciu v podobe udajov v textbox-och a podobnych komponentach.
teraz potrebujem samozrejme pristupovat k tomuto formu zo vsetkych ostatnych a citat hodnoty z tych komponent. je samozrejme nezmysel na kazdom forme vytvarat novu instanciu toho formu s nastaveniami, pretoze ja potrebujem vediet napr. aj vo form3 to, ze form2 zmenil nejaku hodnotu na spolocnom forme. dalsia komplikacia - pri kodovani neviem, ze ktory form zavola spolocny form ako prvy. A to este nehovorim o tom, ze by som chcel k jednotlivym formom pristupovat z ktorehokolvek ineho formu, samozrejme vratane toho ze na jednotlivych formoch si potrebujem pamatat nastavene hodnoty v jednotlivych komponentoch.

No proste som zvyknuty z delphi na moznost si pozapisovat jednotlive formy do uses krizom krazom, vsetky pri spusteni povytvaram a potom volam formy jeden cez druhy ako potrebujem.

Souhlasím  |  Nesouhlasím  |  Odpovědět
 |   | 

Chapu ze jsi na to zvykly, ale budes si muset odvyknout, takhle se to proste nedela. Muzes si treba nadefinovat tridu, ve ktery budou vsechny potrebny udaje a jednotlivy formulare uz je jenom zobrazuji, pripadne meni hodnoty.

Souhlasím  |  Nesouhlasím  |  Odpovědět
 |   | 

přesně tak
doufám že ty kódy co byly výše jsou jen experimentální, do projektu je prosímtě nedávej...

pro aplikační nastavení si udělej statickou třídu jejíž vlastnosti budeš měnit na formuláři app. nastavení, pro každý formulář si udělej datovou třídu a na data je ptej způsobem form1.GetData() kde metoda GetData bude vracet instanci dané datové třídy...přistupovat vzájemně mezi formuláři k textboxům apod...je s prominutím prasečina

Souhlasím  |  Nesouhlasím  |  Odpovědět


Určitě si přečtěte

Volitelná aktualizace Windows 10 opravila několik chyb, způsobila ale další problémy
Karel Kilián
Windows UpdateAktualizaceWindows 10
Nejlepší příslušenství k počítači. Tipy na osvědčené klávesnice, tiskárny, routery…

Nejlepší příslušenství k počítači. Tipy na osvědčené klávesnice, tiskárny, routery…

** Tipy na užitečné příslušenství k počítačům ** Poradíme, s jakými produkty neuděláte chybu ** Od drobností do USB až po routery a tiskárny

David Polesný, Stanislav Janů | 20

David PolesnýStanislav Janů
Příslušenství
Čekali jsme skoro šest let. Android Auto jede do Česka i na Slovensko
Lukáš Václavík
Android AutoNavigaceGoogle
Platby kartou se můžou rozšířit úplně všude. Jako terminál poslouží mobil
Lukáš Václavík
BankaPlacení mobilemNFC
Dalším gigabitovým hráčem bude ČEZ. Internet již poskytuje prvním zákazníkům
Lukáš Václavík
Poskytovatelé internetuPřipojení k internetu
Lidl buduje chytrou domácnost, propojí všechno se vším
Lukáš Václavík
LidlChytrá domácnostIoT
Lépe bylo bez Googlu, přiznal s odstupem bývalý šéf Waze
Markéta Mikešová
WazeGoogle

Aktuální číslo časopisu Computer

Megatest rychlých Wi-Fi 6 routerů

Jak ztišit počítač

Velký test mATX skříní