Předávání dat mezi formuláři.
- Ahoj,
jsem začátečník v C# a i když mám dvě knihy a projel jsem google, nenašel jsem odpověď na svojí asi prostou a jednoduchou otázku.
příklad.
vytvářím ve formuláři malý emailový klient, mám form1 kde je userinterface a pak vytvořený form2, kde jsou vypsaní uživatelem uložení příjemci (a který se zobrazí když uživatel klikne na tlačítko, které tento form2 zobrazí).
problém nastává když otevřu form2 a chci z textového pole např. prvnípříjemce přenést data do form1 do pole příjemce
nevím jestli lze nějak zpřístupnit textové pole příjemce z form1 pří psaní kódu ve form2, tak že bych po kliknutí na tlačítko ok načetl obsah prvnípříjemce z form2 do příjemce ve form1
případně přenést string z form2 do form1
opravdu si nevím rady, díky za jakoukoli informaci
případně, pomůže když nastavím textbox jako public? lze to vůbec? díky
Všechny reakce
- Přesně jak píšete, jedna z cest je dát TextBoxu práva na přístup z jiné třídy.
Je na to vlastnost Modifiers nastavitelná v okně Properties.
Pokud se chce člověk vyhrát trošku sofistikovaněji, nic Vám nebrání přidat do třídy Form1 public metodu, která ten textbox nastaví.
Havetta- Navržen jako odpověďTomas Havetta 1. listopadu 2009 15:59
- Aby jste se k tomu textboxu dostat, musíte samozřejmě ve třídě Form2 mít referenci na Form1. Nejjednodušší cesta je do Form2 přidat property
public Form1 HlavniForm { get; set; }
no a ve Form1 při vytvoření Form2 bude něco jako:
Form2 forma = new Form2();
forma.HlavniForm = this;
forma.Show();
a pak až budete chtít nastavit textbox ve Form1 z Form2 zavoláte
HlavniForm.TextBox1 = "xxxxx";
Tento postup má zasadní vadu krásy v tom, že vznikne tuhá vazba mezi Form1 a Form2.
Lepší a čistější cesta je udělat ten Form2 jako dialogové okno, kde něco uživatel vybere, okno zavře a vy ve Form1 vyčtete co si v tom okně ten člověk vybral a to nastavíte ve Form1 kam chcete. Tím pádem můžete ten Form2 použít kdekoliv jinde, kde budete potřebovat vybrat adresu... A navíc budou ty okna na sobě nezávislé. - Ahoj,
taky jsem řešil podobný problém a velmi mi pomohlo, nastavit do textboxu ve Form1 string, který bude definován jako
public static string promenna;
tím pádem můžu z formu2 volat
form1.promenna = "xxx"; a tím pádem se to vloží i do toho textboxu, protože se textbox bude rovnat té promenné :), snad to pomůže, já od teď řeším komunikaci mezi formy takto... - Ahoj, díky moc za radu, to zní také dobře, rád bych se to taky naučil, ale nevím jakým způsobem budu v textboxu neustále zobrazovat proměnnou?
- Pošlete mi na můj email tomas at havetta.cz kod k Form1 a Form2 (vcetne toho co dela designer) a já Vám napíšu, co děláte špatně.
- díky moc všem za pomoc, na problém jsem však stále kráktý
tomas: nahrál jsem to sem, budu vděčný za jakoukoli radu
http://www.kubatko.info/4ppl/02/program_doma_01.zip
yuraj: díky moc, bohužel jsem z toho dost zmatený, jelikož je tam plno věcí co ještě neznám, zkusím to vyřešit tak jak navrhoval Tomáš - Ked som zacinal v C#, tak som mal tiez problem ako vyriesit tento problem. Su rozne sposoby. Asi najlepsi je to spravit cez delegaty. Neviem ci je to dobre, ale funguje aj tento sposob:Vo Form1 nastav public tie prvky, ktore potrebujes pristupovat z ineho formu.Potom vo Form2 zmen konstruktor takto:
public Form2(Form1 frm) { InitializeComponent(); HlavniForm = frm; }Tam, kde vytvaras okno, prepis na:Form2 prijemci = new Form2(this); prijemci.Show();
Malo by to fungovat. Ked som pozeral tvoj kod, nemal si priradeny odkaz na Form1 vo Form2. Teraz sa posiela odkaz na Form1 do Form-u 2 cez konstruktor... - díky moc za postřeh, určitě to teď už snad klapne :)
časem se určitě víc seznámím s delegáty a budu se snažit ten kód psát sofistikovaněji - tak jsem zpet (nejak jsem se k tomu od te doby poradne nedostal a kdyz dostal tak jsem neuspel), zacal jsem tak rikajic od nuly na novem projektu, jenom k odzkouseni, snad se mnou budete mit jeste trochu trpelivosti (potom co se to snazim udelat s temi zmixovanymi informacemi mi to moc nejde)
chci z druheho (child) formulare predat textove pole do prvniho (parent), samozrejme potom az si vyvolam druhy form zde je vykopirovany kod
druhy formularnamespace test_predavani_dat { public partial class HlavniForm : Form { public HlavniForm() { InitializeComponent(); } private void btnUkazDruhouForm_Click(object sender, EventArgs e) { DruhaForm OdkazNaDruhouForm = new DruhaForm(); OdkazNaDruhouForm.ShowDialog(); } } }
diky moc za odpovedi, pokud budete mit cas objasnit mi proc se mi udaje ve prvni form nezobrazuji, budu vam moc vdecnynamespace test_predavani_dat { public partial class DruhaForm : Form { public DruhaForm() { InitializeComponent(); } private void btnPredejZavri_Click(object sender, EventArgs e) { HlavniForm OdkazNaHlavniForm = new HlavniForm(); OdkazNaHlavniForm.txtTextZDruheForm.Text = txtTextNaPredani.Text; Close(); } } }
Ve druhé formě nemůžeš vytvářet novou instanci hlavní formy!!! To je ta chyba.
Předělej třídu DruhaForma takto:
public partial class DruhaForm : Form
{
public HlavniForm rodic;
public DruhaForm()
{
InitializeComponent();
}
private void btnPredejZavri_Click(object sender, EventArgs e)
{
rodic.txtTextZDruheForm.Text = txtTextNaPredani.Text;
Close();
}
}
a volání po stisku tlačítka na hlavní formě uprav takto:
private void btnUkazDruhouForm_Click(object sender, EventArgs e)
{
DruhaForm OdkazNaDruhouForm = new DruhaForm();
OdkazNaDruhouForm.rodic = this;
OdkazNaDruhouForm.ShowDialog();
}
No a pak to bude fungovat.
POZOR, ten kód ale je v principu špatný a mělo by to být naopak. To jest hodnotu z text pole by si měla vyčíst hlavní forma, ne že druhá forma nastavuje hlavní.
Všimni si, jak se pracuje např. s OpenFileDialog. Přesně tak bys měl dělat i s tou tvou druhou formou.


