Visual Studio Developer Center > Fóra Visual Studio > Visual C# > Předávání dat mezi formuláři.
Odeslat dotazOdeslat dotaz
 

Navržená odpověďPředávání dat mezi formuláři.

  • 31. října 2009 21:05Jakub Yksvoloh Uživatelské medaileUživatelské medaileUživatelské medaileUživatelské medaileUživatelské medaile
     
    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

  • 1. listopadu 2009 15:59Tomas Havetta Uživatelské medaileUživatelské medaileUživatelské medaileUživatelské medaileUživatelské medaile
     Navržená odpověď
    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 16:16Jakub Yksvoloh Uživatelské medaileUživatelské medaileUživatelské medaileUživatelské medaileUživatelské medaile
     
    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:28Tomas Havetta Uživatelské medaileUživatelské medaileUživatelské medaileUživatelské medaileUživatelské medaile
     
    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 17:03Jakub Yksvoloh Uživatelské medaileUživatelské medaileUživatelské medaileUživatelské medaileUživatelské medaile
     
    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 20:22Dusa Uživatelské medaileUživatelské medaileUživatelské medaileUživatelské medaileUživatelské medaile
     
    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:35Jakub Yksvoloh Uživatelské medaileUživatelské medaileUživatelské medaileUživatelské medaileUživatelské medaile
     
    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?
  • 2. listopadu 2009 15:08Tomas Havetta Uživatelské medaileUživatelské medaileUživatelské medaileUživatelské medaileUživatelské medaile
     
    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 16:32Yuraj Uživatelské medaileUživatelské medaileUživatelské medaileUživatelské medaileUživatelské medaile
     
  • 3. listopadu 2009 18:01Jakub Yksvoloh Uživatelské medaileUživatelské medaileUživatelské medaileUživatelské medaileUživatelské medaile
     
    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áš
  • 4. listopadu 2009 8:21Yuraj Uživatelské medaileUživatelské medaileUživatelské medaileUživatelské medaileUživatelské medaile
     Obsahuje kód
    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...
  • 5. listopadu 2009 15:03Jakub Yksvoloh Uživatelské medaileUživatelské medaileUživatelské medaileUživatelské medaileUživatelské medaile
     
    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
  • před 13 hod. 54 min.Jakub Yksvoloh Uživatelské medaileUživatelské medaileUživatelské medaileUživatelské medaileUživatelské medaile
     Obsahuje kód
    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
  • před 11 hod. 57 min.Tomas Havetta Uživatelské medaileUživatelské medaileUživatelské medaileUživatelské medaileUživatelské medaile
     

    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.