Avatar billede suhr Nybegynder
24. november 2005 - 13:01 Der er 43 kommentarer og
1 løsning

opdaterer array i form1 fra form2

Jeg har et array på min form1 der indeholder nogle værdier. Disse værdier indsættes i textbokse på form2. Herfra vil jeg gerne kunne opdatere mit array på form1, således at hvis jeg lukker form2 og åbner den igen vil de rettede værdier nu stå i mine textbokse.

Her er hvad jeg gør når jeg smider værdierne ind i form2:
Form2 form2 = new Form2(this);
            form2.textBox1.Text = behold[0,0].ToString();
            form2.textBox2.Text = behold[1, 0].ToString();
            form2.textBox3.Text = behold[2, 0].ToString();
            form2.textBox4.Text = behold[3, 0].ToString();
            form2.textBox5.Text = behold[4, 0].ToString();
            form2.textBox6.Text = behold[5, 0].ToString();
            form2.textBox7.Text = behold[6, 0].ToString();
            form2.textBox8.Text = behold[7, 0].ToString();
            form2.textBox9.Text = behold[8, 0].ToString();
            form2.textBox10.Text = behold[9, 0].ToString();
            form2.Show();

Giv gerne et eksempel på hvordan jeg herefter gør i form2 for at opdatere form1.

Med Venlig Hilsen
Suhr
Avatar billede dr_chaos Nybegynder
24. november 2005 - 13:05 #1
ligger behold[] som en variabel i form1 ?
Avatar billede suhr Nybegynder
24. november 2005 - 13:22 #2
Ja det er defineret public double[,] behold = new double[10,2]; øverst i form1
Avatar billede dr_chaos Nybegynder
24. november 2005 - 13:29 #3
du sender Form1 med som this når du opretter en instans af Form2.
Den variabel som du får ind i konstruktøren i Form2 kan du bruger på denne måde:
du har noget i denne stil
public Form2(Form owner)
{
//typecast owner.
Form1 form1 = (Form1)owner;
//nu kan du bruger behold i hele form2
form1.Behold[] osv
}
Avatar billede dr_chaos Nybegynder
24. november 2005 - 13:29 #4
håber det giver minimalt mening
Avatar billede dr_chaos Nybegynder
24. november 2005 - 13:30 #5
du sender en reference til form1 med til form2 i og med du bruger
Form2 form2 = new Form2(this);
Avatar billede suhr Nybegynder
24. november 2005 - 13:41 #6
Umiddelbart er det så kun oppe i konstruktøren at jeg har tilgang til form1 arrayet.
Avatar billede dr_chaos Nybegynder
24. november 2005 - 13:48 #7
sæt private Form1 form1 i toppen af din side og skift
Form1 form1 = (Form1)owner;
ud med
form1 = (Form1)owner;
så kan du bruge den på hele siden.
Avatar billede suhr Nybegynder
24. november 2005 - 13:55 #8
Nu har jeg tilgang til arrayet på min form 2, men hvis jeg laver en:
form1.behold[0, 1] = Convert.ToDouble(textBox1.Text);
opdateres arrayet ikke på form1.
Avatar billede suhr Nybegynder
24. november 2005 - 13:57 #9
form1.behold[0, 1] = Convert.ToDouble(textBox1.Text);
er self sat på textBox1_TextChanged
Avatar billede jens87 Nybegynder
24. november 2005 - 14:08 #10
er det ikke fordi du skal bruge double.Parse() ?

i så fald vil din linje skulle være:
form1.behold[0,1] = double.Parse(textBox1.Text.ToString());
Avatar billede suhr Nybegynder
24. november 2005 - 14:11 #11
double.Parse() hjælper ikke på situationen.
Det virker som om at der skabes en instans af form1, og denne opdateres men ikke den originale form1.
Avatar billede dr_chaos Nybegynder
24. november 2005 - 14:14 #12
du skal kalde invalidate på form1.
Avatar billede suhr Nybegynder
24. november 2005 - 14:18 #13
Hvor kaldes den ??
Jeg er meget grøn inden for c#
Avatar billede dr_chaos Nybegynder
24. november 2005 - 14:22 #14
prøv at kalde form1.Invalidate();
npr du har ændret værdien i din tekst box.
eller form1.Refresh();
Avatar billede suhr Nybegynder
24. november 2005 - 14:25 #15
Det er stadig det samme, når jeg lukker min form2 efter at have rettet værdien, og herfeter åbner den igen fra form1 er værdien den samme som før jeg rettede. Så jeg har ikke fået opdateret mit array.
Avatar billede dr_chaos Nybegynder
24. november 2005 - 14:27 #16
har du en funktion som du bruger til at indsætte værdier i dine tekst bokse ?
Avatar billede suhr Nybegynder
24. november 2005 - 14:28 #17
ja på form1-form_load :
            for (int i = 0; i < 10; i++)
            {
                behold[i,0] = 1;
                behold[i,1] = 15;
            }
men jeg reloader jo ikke min form1, så det burde ikke have indvirkning på dette
Avatar billede dr_chaos Nybegynder
24. november 2005 - 14:30 #18
prøv lige at kopier hele din kildekode herind.
tror måske at du har en lille fejl.
Avatar billede suhr Nybegynder
24. november 2005 - 14:32 #19
form1:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace WindowsApplication2
{
    public partial class Form1 : Form
    {
        public double[,] behold = new double[10,2];
        double[,] coins = {
                            {0.25,3,0},
                            {0.50,3,0},
                            {1,3,0},
                            {2,2,0},
                            {5,1,0},
                            {10,3,0},
                            {20,3,0}
                        };
       
        double[,] indkastet = {
                            {0.25,0},
                            {0.50,0},
                            {1,0},
                            {2,0},
                            {5,0},
                            {10,0},
                            {20,0}
                        };

        double indkast, rest, udbetal;

        public Form1()
        {
            InitializeComponent();
        }

        private void retursystem()
        {
            for (int i = 6; i >= 0; i--)
            {
                if (rest >= coins[i, 0] && coins[i, 1] == 0)
                {
                    if (i == 0)
                    {
                        label7.Text = "Indkast kun lige penge";
                        break;
                    }
                    else
                    {
                        i--;
                    }
                }
                while (rest >= coins[i, 0] && coins[i,1] > 0)
                {
                    rest = rest - coins[i, 0];
                    coins[i, 2] = coins[i, 2] + 1;
                    if (coins[i, 1] > 0)
                    {
                        double temp = coins[i, 0] * coins[i, 2];
                        udbetal = udbetal + temp;
                        label6.Text = udbetal.ToString();
                        if (coins[i, 2] > 0)
                        {
                            coins[i, 1] = coins[i, 1] - coins[i, 2];
                            coins[i, 2] = 0;
                        }
                    }
                    else
                    {
                        i--;
                        //udbetal = 0;
                    }
                }
            }
        }

        private void opdater_kasse()
        {
            for (int i=0; i <= 6; i++)
            {
                coins[i, 1] = coins[i,1] + indkastet[i, 1];
                indkastet[i, 1] = 0;
            }
        }

        private void testing()
        {
            for(int i=0;i<=6;i++)
            {
                MessageBox.Show(coins[i,0].ToString() + "kr - " + coins[i,1].ToString() + " tilbage");
            }
        }

        private void knaptryk(int a, string b)
        {
            if (behold[a,0] > 0)
            {
                label1.Text = "Varen koster " + behold[a,1].ToString() + " kr";
                label2.Text = "Indkast venligst "+ behold[a,1].ToString() + " kr";
                if (indkast > 0)
                {
                    if (indkast >= behold[a, 1])
                    {
                        behold[a, 0] = behold[a, 0] - 1;
                        //MessageBox.Show(behold[a,0].ToString());
                        rest = indkast - behold[a, 1];
                        label2.Text = b;
                        if (rest > 0)
                        {
                            // udbetal rest
                            retursystem();
                            if (udbetal == 0)
                            {
                                label4.Text = "Det er desværre ikke muligt at give penge tilbage";
                            }
                            else
                            {
                                label4.Text = udbetal.ToString() + " kr retur";
                            }
                            udbetal = 0.0;
                            rest = 0.0;
                        }
                    }
                    else
                    {
                        rest = behold[a, 1] - indkast;
                        label2.Text = "Indkast yderligere " + rest;
                    }
                    button1.Enabled = false;
                    button2.Enabled = false;
                    button3.Enabled = false;
                    button4.Enabled = false;
                    button5.Enabled = false;
                    button6.Enabled = false;
                    button7.Enabled = false;
                    button8.Enabled = false;
                    button9.Enabled = false;
                    button10.Enabled = false;
                    comboBox1.Enabled = false;
                    timer1.Enabled = true;
                }
                //læg penge i kassen (opdater coins)
                opdater_kasse();
            }
            else
            {
                label2.Text = "Der er ikke flere tilbage";
            }
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            label1.Text = "Iskold ColaCola";
            label2.Text = "15 kr";
           
            for (int i = 0; i < 10; i++)
            {
                behold[i,0] = 1;
                behold[i,1] = 15;
            }
        }

        private void button1_Click(object sender, EventArgs e)
        {
            knaptryk(0,button1.Text);
        }

        private void button2_Click(object sender, EventArgs e)
        {
            knaptryk(1,button2.Text);
        }

        private void button3_Click(object sender, EventArgs e)
        {
            knaptryk(2,button3.Text);
        }

        private void button4_Click(object sender, EventArgs e)
        {
            knaptryk(3,button4.Text);
        }

        private void button5_Click(object sender, EventArgs e)
        {
            knaptryk(4,button5.Text);
        }

        private void button6_Click(object sender, EventArgs e)
        {
            knaptryk(5,button6.Text);
        }

        private void button7_Click(object sender, EventArgs e)
        {
            knaptryk(6,button7.Text);
        }

        private void button8_Click(object sender, EventArgs e)
        {
            knaptryk(7,button8.Text);
        }

        private void button9_Click(object sender, EventArgs e)
        {
            knaptryk(8,button9.Text);
        }

        private void button10_Click(object sender, EventArgs e)
        {
            knaptryk(9,button10.Text);
        }

        private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
        {
            indkast = Convert.ToDouble(comboBox1.SelectedItem) + indkast;
            indkastet[comboBox1.SelectedIndex, 1] = indkastet[comboBox1.SelectedIndex, 1] + 1;
            label3.Text = "Der er nu indkastet " + indkast.ToString() + " kr";
            timer2.Enabled = true;
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            indkast = 0;
            button1.Enabled = true;
            button2.Enabled = true;
            button3.Enabled = true;
            button4.Enabled = true;
            button5.Enabled = true;
            button6.Enabled = true;
            button7.Enabled = true;
            button8.Enabled = true;
            button9.Enabled = true;
            button10.Enabled = true;
            comboBox1.Enabled = true;

            label1.Text = "Iskold ColaCola";
            label2.Text = "15 kr";
            label3.Text = "";
            label4.Text = "";
            timer1.Enabled = false;
        }

        private void timer2_Tick(object sender, EventArgs e)
        {
            comboBox1.Text = "Indkast mønter";
            timer2.Enabled = false;
        }

        private void button11_Click_1(object sender, EventArgs e)
        {
            label3.Text = "";
            label4.Text = indkast.ToString() + " kr tilbage";
            indkast = 0;
            timer1.Enabled = true;
        }

        private void button12_Click(object sender, EventArgs e)
        {
            Form2 form2 = new Form2(this);
            form2.textBox1.Text = behold[0,0].ToString();
            form2.textBox2.Text = behold[1, 0].ToString();
            form2.textBox3.Text = behold[2, 0].ToString();
            form2.textBox4.Text = behold[3, 0].ToString();
            form2.textBox5.Text = behold[4, 0].ToString();
            form2.textBox6.Text = behold[5, 0].ToString();
            form2.textBox7.Text = behold[6, 0].ToString();
            form2.textBox8.Text = behold[7, 0].ToString();
            form2.textBox9.Text = behold[8, 0].ToString();
            form2.textBox10.Text = behold[9, 0].ToString();
            form2.Show();
        }

    }
}

form2:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace WindowsApplication2
{
    public partial class Form2 : Form
    {
        private Form1 form1;
        public Form2(Form owner)
        {
            form1 = (Form1)owner;
           
            //form1.behold[0, 1] = Convert.ToDouble(textBox1.Text);

            InitializeComponent();
        }

        private void Form2_Load(object sender, EventArgs e)
        {

            //TextBox[] textBox = new TextBox[10];
            //textBox[1] = textBox1;
            //textBox[1].Text = "hejsa";
        }

        private void textBox1_TextChanged(object sender, EventArgs e)
        {
            //Form1 form1 = new Form1();
            //form1.behold[0, 1] = Convert.ToDouble(textBox1.Text);
            form1.behold[0, 1] = double.Parse(textBox1.Text.ToString());
            form1.Refresh();
            MessageBox.Show(form1.behold[0, 1].ToString());
        }
    }
}
Avatar billede dr_chaos Nybegynder
24. november 2005 - 14:39 #20
i MessageBox.Show(form1.behold[0, 1].ToString()); er værdien så ændret ?
Avatar billede suhr Nybegynder
24. november 2005 - 14:39 #21
ja det er den
Avatar billede dr_chaos Nybegynder
24. november 2005 - 14:41 #22
ok hvor er det at værdierne fra behold vises ?
Avatar billede suhr Nybegynder
24. november 2005 - 14:44 #23
ved et knapklik på form1 indsættes værdierne i teksbokse på form2, og form2 vises.
Avatar billede dr_chaos Nybegynder
24. november 2005 - 14:46 #24
ja det har jeg forstået men vises de ikke på form1 noget sted ?
Avatar billede suhr Nybegynder
24. november 2005 - 14:47 #25
Jeg har lige prøvet at lave udskrivningen i form2, og dette går fint. Men jeg kan stadig ikke skrive til arrayet, altså kun læse.
Avatar billede suhr Nybegynder
24. november 2005 - 14:48 #26
nej de vises ikke på form1 dog testes der på om indholdet er større end 0
Avatar billede dr_chaos Nybegynder
24. november 2005 - 14:51 #27
hmm prøv at lave behold til et static array.
Avatar billede suhr Nybegynder
24. november 2005 - 14:56 #28
så kan jeg ikke kalde den i form2
Avatar billede dr_chaos Nybegynder
24. november 2005 - 14:58 #29
hmmm drop det med static.
er ved at løbe tør for ideer.
Avatar billede suhr Nybegynder
24. november 2005 - 15:06 #30
Takker da for din tid, og lader spørgsmålet stå.
Avatar billede dr_chaos Nybegynder
24. november 2005 - 15:09 #31
prøv lige at se om din form load bliver kaldt når du lukker form2 og trykker på knappen igen.
Avatar billede suhr Nybegynder
24. november 2005 - 15:22 #32
form load på form1 bliver ikke kørt.
Avatar billede dr_chaos Nybegynder
24. november 2005 - 15:25 #33
og den bliver på intet tidspunkt kaldt kaldt inden du igen trykker button 12?
Avatar billede Syska Mester
24. november 2005 - 17:35 #34
Brug din debugger, så finder du nok fejlen.....

kan ikke lige umildbart se noget..... er nok en lille dum fejl et sted..... men via debuggenren kan du se om dataen ren faktisk også bliver sat....

// ouT
Avatar billede suhr Nybegynder
25. november 2005 - 08:12 #35
Tjae data bliver sat, det blir bare sat på instansen af form1, og ikke på originalen.
Avatar billede dr_chaos Nybegynder
25. november 2005 - 08:13 #36
du har kun de 2 forms ?
Avatar billede suhr Nybegynder
25. november 2005 - 08:23 #37
jeps der er kun de 2 forms.
Avatar billede polle007 Nybegynder
25. november 2005 - 08:29 #38
I form1 kunne du lave en UpdateUI funktion

public void UpdateUI()
{
    button1.PerformClick();
    button2.PerformClick();
    button3.PerformClick();
    button4.PerformClick();
    button5.PerformClick();
    button6.PerformClick();
    button7.PerformClick();
    button8.PerformClick();
    button9.PerformClick();
    button10.PerformClick();
}

Den kalder du så fra form2, når du har opdateret arrayet
Avatar billede dr_chaos Nybegynder
25. november 2005 - 08:29 #39
har du noget sted på form1 hvor du viser værdierne ?
Avatar billede suhr Nybegynder
25. november 2005 - 09:09 #40
nej jeg har ikke lige noget sted der udskriver arrayet på form1, dog blir der tjekket på om værdien er større end 0. Men jeg kan hurtigt sætte et label til at udskrive den første værdi, den som jeg tester på.
Avatar billede suhr Nybegynder
25. november 2005 - 09:42 #41
dr_chaos smid et svar, private Form1 form1 skulle lige ændres til public så kørte det.
Tak for hjælpen.
Avatar billede dr_chaos Nybegynder
25. november 2005 - 09:59 #42
svar :)
Avatar billede Syska Mester
25. november 2005 - 11:51 #43
det giver da ingen mening..... så burde du da have fået en compile fejl eller andet...

// ouT
Avatar billede dr_chaos Nybegynder
25. november 2005 - 12:12 #44
nej fordi at han parsede en instans af form1 til en private form1 i Form2.
På den måde kunne han ændre data i form1 men det blev aldrig ført ned til Form1 instansen.
p.ga. private. så galdt ændringerne kun i Form2.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester