Skicka data mellan två forms i C#?

Elektronik- och mekanikrelaterad mjukvara/litteratur. (T.ex schema-CAD, simulering, böcker, manualer mm. OS-problem hör inte hit!)
Användarvisningsbild
Jeppsson
EF Sponsor
Inlägg: 810
Blev medlem: 3 oktober 2005, 18:00:43
Ort: Karlskrona

Skicka data mellan två forms i C#?

Inlägg av Jeppsson »

Som jag skrev i Ämnet så behöver jag hjälp med att skicka data mellan två olika Forms i C# 2008.

Det hela ingår i ett större projekt men jag har brutit ut problemet så att det skall vara lättare att förklara och så att det inte finns andra "störande" moment i koden.

Jag lyckas med att skicka data från Form1 en gång när jag öppnar Form2 med myForm2.Show();, men sen vill jag ha Form2 öppen helatiden och att värdet skall bara uppdateras hela tiden i Form2 när det ändras i Form1. Jag misstänker att man kan lösa det med en Event man jag lyckas inte med att skicka en Event mellan de olika Formsen.

Programmet som det ser ut så här långt:

Jag har två forms som huvudformen heter Form1 och den andra Form2.
I Form1 finns följande object:
textBox som heter Form1textBox
trackBar som heter Form1trackBar

I Form2 finns endast en textBox som heter Form2textBox.

Bild Bild

Kod: Markera allt

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

        private void Form1trackBar_Scroll(object sender, EventArgs e)
        {
            Form1textBox.Text = Form1trackBar.Value.ToString();
            Form2 myForm2 = new Form2();
            myForm2.Form2_textBox_Store(Form1trackBar.Value.ToString());
            myForm2.Show();
        }
    }
}

Kod: Markera allt

namespace Form_to_Form_ver_2
{
    public partial class Form2 : Form
    {
        public Form2()        
    {
            InitializeComponent();
        }

        public void Form2_textBox_Store(string TempText)
        {
            Form2textBox.Text = TempText;
        }
    }
}
Så vet någon hur man skickar Events mellan olika forms eller har ett förslag på en annan lösning så hjälp mig gärna...

Mvh

Jeppsson
Användarvisningsbild
nlinus
Inlägg: 805
Blev medlem: 16 januari 2007, 17:49:14
Ort: Åre kommun

Re: Skicka data mellan två forms i C#?

Inlägg av nlinus »

Som det ser ut nu så skapar du en ny Form2 varje gång trackbaren uppdateras.
Det bör räcka att skapa denna en gång, t.ex i konstruktorn eller Load-eventet på Form1.

Nånting sånt här kanske.... Jobbar (tyvärr) i VB för det allra mesta, så jag kan ha gjort något syntaxfel.

Kod: Markera allt

namespace Form_to_Form_ver_2
{
    public partial class Form1 : Form
    {

        private Form2 myForm2;

        public Form1()
        {
            InitializeComponent();
            myForm2 = new Form2();
            myForm2.show();
        }

        private void Form1trackBar_Scroll(object sender, EventArgs e)
        {
            Form1textBox.Text = Form1trackBar.Value.ToString();
            myForm2.Form2_textBox_Store(Form1trackBar.Value.ToString());
        }
    }
}
Sen är väl kontrollerna i en form Public, så du borde väl kunna slopa funktionen Form2_textBox_Store och uppdatera textboxen direkt från Form1:

Kod: Markera allt

        private void Form1trackBar_Scroll(object sender, EventArgs e)
        {
            Form1textBox.Text = Form1trackBar.Value.ToString();
            myForm2.Form2textBox.Text = Form1trackBar.Value.ToString();
        }
Ett alternativ är ju att låta Form2 lyssna på Scroll-eventet för trackbaren i Form1. Finns tusen sätt att lösa detta på.
Normalt brukar man (rätta mig om jag har fel) eftersträva att ha data och logik separerade från användargränssnittet. D.v.s den data som uppdateras av trackbaren får ligga separat. Det objektet kan då trigga ett event när det uppdateras, och en eller flera forms kan lyssna på detta event för att uppdatera sina kontroller.
sodjan
EF Sponsor
Inlägg: 43249
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Skicka data mellan två forms i C#?

Inlägg av sodjan »

Förr (VB6 och liknande) så var det så att en form inte "ser" objekt på/i
en anna form direkt. Sannolikt går dett att göra dom globala, eller
så får man ange det andra formen för objektet , t.ex :

Kod: Markera allt

myForm2.Form2textBox.Text = Form1.Form1trackBar.Value.ToString();
alltså om den koden körs "av" eller "under" myForm2...
Användarvisningsbild
Jeppsson
EF Sponsor
Inlägg: 810
Blev medlem: 3 oktober 2005, 18:00:43
Ort: Karlskrona

Re: Skicka data mellan två forms i C#?

Inlägg av Jeppsson »

Det är inga problem att skicka över data en gång.

Kod: Markera allt

public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            //Form2 myForm2 = new Form2();
            //myForm2.Show();
        }

        private void Form1trackBar_Scroll(object sender, EventArgs e)
        {
            Form1textBox.Text = Form1trackBar.Value.ToString();
            Form2 myForm2 = new Form2();
            myForm2.Form2textBox.Text = Form1trackBar.Value.ToString();
            myForm2.Show();
        }
    }
Men jag måste ha myForm2.Show(); efter jag har tryckt in datan i myForm2.Form2textBox.Text annars så vissas det inte i Form2. Så där hoppas jag på att skunna skicka en Event istället.

Men hur skickar man en event till en annan Form? :humm:
Användarvisningsbild
nlinus
Inlägg: 805
Blev medlem: 16 januari 2007, 17:49:14
Ort: Åre kommun

Re: Skicka data mellan två forms i C#?

Inlägg av nlinus »

Sodjan:
Det kanske stämmer, men ditt exempel lär inte heller fungera då Form1.Form1trackBar inte pekar på något objekt. Möjligtvis var det myForm1.Form1trackBar du tänkte, men det kräver ju då att Form1trackBar är public. :humm:

I vilket fall så lär det första av mina exempel funka (efter att de eventuella felen rättats), och jag tar tillbaks mitt tillägg då det verkar som att Sodjan hade rätt *snurrig*.

Edit: För att svamla vidare... Detta kanske ger lite klarhet i frågan. Kommentarerna nämner en del om det här med att låta forms uppdatera varandra också.
Användarvisningsbild
nlinus
Inlägg: 805
Blev medlem: 16 januari 2007, 17:49:14
Ort: Åre kommun

Re: Skicka data mellan två forms i C#?

Inlägg av nlinus »

Jeppson,
jo myForm2 är ju redan framme, och varje gång du ger textboxen ett nytt värde så uppdateras den. Som du har gjort så skapar en en ny Form2 varje gång trackbaren uppdateras. Det blir en väldig massa skapande av objekt.

Tillägg:
Events "skickar" man väl inte i ordets rätta bemärkelse. Ett event triggas, och så har det ett gäng eventlisteners som lyssnar på det och reagerar när det triggas.
D.v.s i myForm2 ska det finnas en eventlistener som lyssnar på scroll-eventet i myForm2.

Tillägg 2:
Har du provat att köra mitt exempel? Det du visade senast är inte speciellt likt. Blandannat har du inte med private Form2 myForm2;
Användarvisningsbild
Jeppsson
EF Sponsor
Inlägg: 810
Blev medlem: 3 oktober 2005, 18:00:43
Ort: Karlskrona

Re: Skicka data mellan två forms i C#?

Inlägg av Jeppsson »

Jag har försökt med det som du skriver nlinus enligt nedan:

Har även gjort Form2textBox till Public

Kod: Markera allt

public partial class Form1 : Form
    {
        private Form2 myForm2;

        public Form1()
        {
            InitializeComponent();
            Form2 myForm2 = new Form2();
            myForm2.Show();
        }

        public void Form1trackBar_Scroll(object sender, EventArgs e)
        {
            Form1textBox.Text = Form1trackBar.Value.ToString();
            myForm2.Form2textBox.Text = Form1trackBar.Value.ToString();
        }
    }
När jag kör det så får jag följande fel när jag ändrar på Form1trackBar:

Objektreferensen har inte angetts till en instans av ett objekt.
myForm2.Form2textBox.Text = Form1trackBar.Value.ToString();
Användarvisningsbild
E85
Inlägg: 1274
Blev medlem: 29 maj 2007, 16:24:19
Ort: Övik

Re: Skicka data mellan två forms i C#?

Inlägg av E85 »

Jag brukar ha en statisk klass med all data i om det behöver nås från flera olika Forms.. och en timer som kollar efter förändring. Litet fulfix kanske men det funkar.

Du har skrivit lite galet i kontruktorn tror jag. Det ska vara

Kod: Markera allt

public Form1()
{
   InitializeComponent();
   myForm2 = new Form2(); //Ingen deklarering här
   myForm2.Show();
}
janno
Inlägg: 431
Blev medlem: 11 oktober 2009, 07:34:45
Ort: Västerås

Re: Skicka data mellan två forms i C#?

Inlägg av janno »

Eller varför inte skicka med Form1 som argument till Form2. Då kan man enkelt uppdatera instansvariabler mellan dem.

Kod: Markera allt

public Form1()
{
   InitializeComponent();
   myForm2 = new Form2(this);
   myForm2.Show();
}
Du måste så klart deklarera en ny konstruktor som tar argumentet av typen Form1 också i Form2.
Användarvisningsbild
nlinus
Inlägg: 805
Blev medlem: 16 januari 2007, 17:49:14
Ort: Åre kommun

Re: Skicka data mellan två forms i C#?

Inlägg av nlinus »

Som E85 skriver; du har inte följt mitt exempel till punkt och pricka :?

Janno: Denna lösning funkar ju också alldeles utmärkt :)

Jeppson: Förlåt mig om jag tar ut något i förskott nu, men det är svårt att veta vilka förkunskaper folk har. Läs gärna någon riktigt bra genomgång av principerna bakom objektorienterad programmering. Detta kommer hjälpa dig långt :)
Användarvisningsbild
LHelge
Inlägg: 1772
Blev medlem: 2 september 2007, 18:25:31
Ort: Östergötland
Kontakt:

Re: Skicka data mellan två forms i C#?

Inlägg av LHelge »

Annars räcker det att skicka med din trackbar som ett argument till konstruktorn på Form2 och prenumerera på eventet där med.

Något i stil med:

Kod: Markera allt

public Form2(TrackBar tb)
{
    tb.Changed += new EventHandler(.....
}

private void tb_changed(.....
{
    Form2TextBox.Text = ((TrackBar)sender).Value;
}
Användarvisningsbild
nlinus
Inlägg: 805
Blev medlem: 16 januari 2007, 17:49:14
Ort: Åre kommun

Re: Skicka data mellan två forms i C#?

Inlägg av nlinus »

Som sagt; finns tusen lösningar. Denna känns ju också lite snyggare än ursprungslösningen :)
Användarvisningsbild
Jeppsson
EF Sponsor
Inlägg: 810
Blev medlem: 3 oktober 2005, 18:00:43
Ort: Karlskrona

Re: Skicka data mellan två forms i C#?

Inlägg av Jeppsson »

Hej

Jag tackar så mycket för hjälpen, jag måste skylla på trötthet efter att ha haft nattpasset med förkyllt barn.
Men efter att kollat koden riktigt noga så funkar det, tack för att du inte gav dig nlinus!

Så här ser den fungernade koden ut, det ända man måste göra i Form2 är att ändra Form2textBox Modifiers till public.

Kod: Markera allt

public partial class Form1 : Form
    {
        private Form2 myForm2;

        public Form1()
        {
            InitializeComponent();
            myForm2 = new Form2();
            myForm2.Show();
        }

        private void Form1trackBar_Scroll(object sender, EventArgs e)
        {
            Form1textBox.Text = Form1trackBar.Value.ToString();
            myForm2.Form2textBox.Text = Form1trackBar.Value.ToString();
        }
    }
Roger_Soderblom
Inlägg: 168
Blev medlem: 23 juni 2008, 10:24:30
Ort: Bro

Re: Skicka data mellan två forms i C#?

Inlägg av Roger_Soderblom »

Tycker du ska ta och titta lite på observer design pattern.

http://en.wikipedia.org/wiki/Observer_pattern
Skriv svar