Sida 1 av 1

Skicka data mellan två forms i C#?

Postat: 9 januari 2010, 22:49:09
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

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

Postat: 10 januari 2010, 00:43:19
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.

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

Postat: 10 januari 2010, 01:04:46
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...

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

Postat: 10 januari 2010, 01:20:45
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:

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

Postat: 10 januari 2010, 01:21:30
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å.

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

Postat: 10 januari 2010, 01:24:21
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;

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

Postat: 10 januari 2010, 01:59:42
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();

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

Postat: 10 januari 2010, 05:05:15
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();
}

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

Postat: 10 januari 2010, 08:02:33
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.

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

Postat: 10 januari 2010, 12:55:46
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 :)

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

Postat: 10 januari 2010, 14:05:27
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;
}

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

Postat: 10 januari 2010, 14:12:25
av nlinus
Som sagt; finns tusen lösningar. Denna känns ju också lite snyggare än ursprungslösningen :)

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

Postat: 10 januari 2010, 20:02:07
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();
        }
    }

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

Postat: 11 januari 2010, 10:15:41
av Roger_Soderblom
Tycker du ska ta och titta lite på observer design pattern.

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