none
Předávání dat mezi formuláři.

    Dotaz

  • 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

    31. října 2009 21:05

Odpovědi

  • 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.

    24. listopadu 2009 20:35

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
    1. listopadu 2009 15:59
  • Děkuji za odpověď, ale zdá se, že to můj problém neřeší.

    Jelikož když chci psát kód ve form2.cs tak mi nenabídne textbox z form1, což já bych zrovna potřeboval.

    přidávám názorný obrázek, tzn pokud vyberu příjemce jedna a kliknu na ok, tak se obsah prijemce cislo 1 zkopíruje do prijemce ve form1

    Photobucket
    1. listopadu 2009 16:16
  • 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é.
    1. listopadu 2009 16:28
  • děkuji, zatím to zkouším tou horší metodou

    zdá se, že mi to už začíná zapadat, jediné s čím si teď nevím rady je proč se děje tohle:


    Photobucket

    nevím proč nemůžu jednoduše poslat danná data do již specifikovaného textboxu

    díky předem za pomoc
    1. listopadu 2009 17:03
  • 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...
    1. listopadu 2009 20:22
  • 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?
    1. listopadu 2009 20:35
  • 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ě.
    2. listopadu 2009 15:08
  • 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áš
    3. listopadu 2009 18:01
  • 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...
    4. listopadu 2009 8:21
  • 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
    5. listopadu 2009 15:03
  • 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

    namespace 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();
            }
        }
    }
    druhy formular

    namespace 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();
            }
        }
    }
    
    diky moc za odpovedi, pokud budete mit cas objasnit mi proc se mi udaje ve prvni form nezobrazuji, budu vam moc vdecny
    24. listopadu 2009 18:38
  • 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.

    24. listopadu 2009 20:35
  • super, dekuji moc, již to funguje, nicméně začínám asi chápat proč je to špatný postup. Ale aspoň vím jak na tohle základní.

    Můžeš mi prosim na tomhle příkladě říct co konkrétně dělá ten příkaz "this" ?Děkuji
    27. listopadu 2009 21:53