C# kezdő

Fórumok

Sziasztok!

Ez egy alacsonyan leszedhető gyümölcs lesz annak aki eléri, biztosan elég sokan lesznek.

C#-ban van két form-om. Form1-en egy textbox egy meghatározott alapértékkel, amit egy gomb megnyomásával át akarok küldeni a másik form-nak. A gomb lenyomásának pillanatában de még a .ShowDialog() előtt, direkt ki is a bárki által begépelt értéket (TextChanged event), csakhogy a másik form-on mikor létrehozom az új form1 object-et akkor hivatkozva az 1-es formon a textbox datára a form1-nek az alapértékét írja ki.

A form1-en jó a változtatott data mert ezt ki is iratom, a form2-re viszont mégis az alapértelmezett kerül át.

Azon tanakodtam hogy a new object egy újat hoz létre a form1-ből ami miatt mégis ugye az alapértéket kapom meg - ez logikus is lenne. Hogyan lehetne a form1-en belül létrehozni az object-et amit átadnék épp aktuális datával a form2-nek?

Köszi.

Hozzászólások

Mondanám, hogy mutass kódot, de sejtem, illetve a kérdésed alapján te is rájöttél, hogy a két form *példány* között kell adatot cserélni. A form2-n hiába csinálsz egy új form1-et, ezt nagyon gyorsan felejtsd el.

Tipikusan a Form2 konstruktor várjon egy paramétert: public Form2(string valami) {}. A Form1 pedig így hívja meg: new Form2(textbox1.Text).ShowDialog(). Ha több adatcsere kell, akkor a Form1 átadhatja saját magát (this), a Form2 pedig egy Form1 típusú paramétert vár, és beszélgethetnek egymással ide-oda.

--

Szerintem tedd ki valahova a kódot (ha nem ipari titok).
Sokkal könnyebben kitaláljuk, mi a hiba.

Fuszenecker Róbert

Ez szerintem ebben az esetben a dolgok túlkomplikálása.

Eleve, mivel showdialog()-al nyitja a form2-t, valószinű nem is kell folyamatosan szinkronizálni form1->form2 irányban (hiszen nem is tud a form1-en matatni a user amig nyitva van a form2), igy felesleges event-ekkel bohóckodni, bőven elég fejesjoco által irt technika, hogy konstruktorban átadod a form2-nek a string-et és kész.

(más kérdés, hogy a másik ajánlott megoldás (a form1 példányának átadása) okozhat gondokat, az eventek nem fognak lefutni amit a form2-n adsz hozzá. Ha folyamatos szinkron kell form1->form2 irányban, akkor érdemesebb fenntartani form1-en egy változóban a példányt a nyitott form2-ből és a form1.textbox.textchanged event-ben átirni a form2-n lévő textbox text-jét. Ehhez persze public-ká kell tenni a form2.textbox-ot, vagy bevezetni egy külön property-t stb-stb)

majd valami c# guru kijavit.

a form2-n a textbox modifiers property-jet tedd at publicra.
amikor meg nyomod a gombot valami ilyen kod kell.


Form f = new Form2();
f.ottanitestboxneve.Text = ittenitextboxneve.Text;
f.ShowDialog();

--
A vegtelen ciklus is vegeter egyszer, csak kelloen eros hardver kell hozza!

Így nem kell a textBox1-nek publicnak lennie:


    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        public Form1(string text):this()
        {
            textBox1.Text = text;
        }

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

Elnézést, elég sűrű volt a dolog hogy vissza tudjak térni. Szóval nem, nem ipari titok a kód - látom leveszik a szóközöket, stb.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace GUITeszt
{

public partial class Form1 : Form
{
public string host { get; set; }

public Form1()
{
Application.EnableVisualStyles();
InitializeComponent();
this.textBox1.Text = "Alapérték";
}

private void textBox1_TextChanged(object sender, EventArgs e)
{
host = this.textBox1.Text;
}

private void button1_Click(object sender, EventArgs e)
{
switch (comboBox2.SelectedIndex)
{
case -1:
MessageBox.Show("Nem választottál semmit.");
break;

case 0:
MessageBox.Show("A host értéke: " + host); // Itt még jó az érték
Form2 form_Form2 = new Form2();
form_Form2.ShowDialog();
break;
}
}
}
}

Form2:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace GUITeszt
{

public partial class Form2 : Form {

public Form2()
{
InitializeComponent();
}

private void button1_Click(object sender, EventArgs e)
{
Form1 adat = new Form1(); // Lehet nem kéne újat csinálnom belőle?
string host = adat.host;

if (checkBox1.Checked)
{
MessageBox.Show("Host értéke: " + host); // Itt már az "Alapérték"
}
else if (!checkBox1.Checked)
{
MessageBox.Show("Host értéke: " + host);
}
}
}
}

Azt értem hogy ott vesztem el az értéket amikor new-val újat hozok létre, de akkor hogy kell átadni a régi meglévő object-et a másiknak? Vagyis ezt hogy tudom megoldani?

Köszi a türelmet üdv :)