Avatar billede alex_sleiborg Nybegynder
10. januar 2006 - 10:48 Der er 45 kommentarer og
3 løsninger

Ændre indstillinger i en form, fra en anden form

Hvordan ændrer jeg feks. hvad der står i en af mine labels, fra en anden form af

Jeg kan nemlig ikke bare lave en metode, og så kalde metoden fra den anden form. Så sker der intet


Feks.


public void test()
{
  this.lbl_ServerRunning.Text = "Kører";
}

og så kalde den metode fra en anden form, det vil ikke ændre min label tekst

Nogen der kan hjælpe???
Avatar billede casualty Nybegynder
10. januar 2006 - 11:02 #1
Kan du ikke poste koden der kalder metoden i din form.

Er du sikker på at det er den rigtige instans du kalder?
Avatar billede alex_sleiborg Nybegynder
10. januar 2006 - 11:04 #2
public void UpdateControl(bool StartStop)
        {
            if (StartStop == true)
            {
                MessageBox.Show("Startet");
                this.lbl_ServerRunning.Text = "Kører";
                this.lbl_ServerRunning.ForeColor = System.Drawing.Color.Chartreuse;
            }
            else
            {
                this.lbl_ServerRunning.Text = "Stoppet";
                this.lbl_ServerRunning.ForeColor = System.Drawing.Color.Red;
                CloseSockets();
            }
        }

Connection con = new Connection();
            con.UpdateControl(false);
Avatar billede Syska Mester
10. januar 2006 - 11:12 #3
Send en reference af Form1 med til din Form2, så kan du via den Reference kalde dine funktioner på Form1....

Det spm har været oppe at vende før på eksperten :-)

// ouT
Avatar billede nielle Nybegynder
10. januar 2006 - 11:12 #4
1) Med:

Connection con = new Connection();
con.UpdateControl(false);

- får du vist slet ikke vist con? Du mangler et kald til Show eller ShowDialog...

2) Bliver din MessageBox vist når du kalder funktionen?

3) Har du prøvet at kalde Invalidate()?

public void UpdateControl(bool StartStop)
{
    if (StartStop == true)
    {
        MessageBox.Show("Startet");
        this.lbl_ServerRunning.Text = "Kører";
        this.lbl_ServerRunning.ForeColor = System.Drawing.Color.Chartreuse;
    }
    else
    {
        this.lbl_ServerRunning.Text = "Stoppet";
        this.lbl_ServerRunning.ForeColor = System.Drawing.Color.Red;
        CloseSockets();
    }

    this.Invalidate();
}
Avatar billede Syska Mester
10. januar 2006 - 11:16 #5
Kan ikke lige finde nogen af dem, men de er her....
Avatar billede alex_sleiborg Nybegynder
10. januar 2006 - 11:16 #6
Nielle

1. Den er allerede startet


2. Ja min MessageBoxen bliver vist, så koden bliver eksekveret

3. Hva mener du med Invalidate() ?

buzzzz har du gider du sende et link, eller uddybe det?
Avatar billede Syska Mester
10. januar 2006 - 11:18 #7
Ups, bare overse min post ovenfor, ved sq ikke lige hvad jeg ville skrive, og så postede jeg.......... FLOT tirsdags bummert

// ouT
Avatar billede nielle Nybegynder
10. januar 2006 - 11:22 #8
Ad 1) I dit kodeeksempel opretter du ellers en ny instans af klassen....

Ad 3) Ved at kalde Invalidate() tvinger man en form til at gentegne sig selv. Dette gøres ikke nødventigvis helt automatisk. I mit kodeeksempel har jeg vist hvordan du kalder Invalidate() - sidste linje.
Avatar billede Syska Mester
10. januar 2006 - 11:27 #9
er Connection en Form? Hvis, så kan du jo ikke bare oprete en ny, og tro at den stadig pejer på den samme form du har oprettet tidligere.....

Tror der skal lidt mere forklaring til.....

Er totalt forvirret om hvordan dit program hænger sammen....

// ouT
Avatar billede alex_sleiborg Nybegynder
10. januar 2006 - 11:29 #10
Tror jeg har fundet fejlen. Problemet er jo at jeg opretter et nyt objekt, og tror jeg kan ændre i den gamle form
Avatar billede Syska Mester
10. januar 2006 - 11:30 #11
Til at svare på det du startede med at skrive, jo du kan godt bare oprette en Metode, og så kalde den fra en anden form.... problemet er jo hvis du opretter en ny instance af den form, og kalder metoden på den nye du lige har oprettet, så er det klart at der ikke sker noget.....

Det du kan gøre er at sende en reference med fra form1 til din form2, og så fra form2 kan du kalde alt på form1 da du har en reference tilbage til form1 i form2..

WOW, en gang formx skrivning, håber du forstår :-)

// ouT
Avatar billede nielle Nybegynder
10. januar 2006 - 11:31 #12
Nemlig, det var jo det jeg skrev i "Ad 1)" ovenfor. ;^)
Avatar billede Syska Mester
10. januar 2006 - 11:31 #13
Ja, det kan jeg kun give dig ret i, kunne jeg næsten fornemme.....

// ouT
Avatar billede Syska Mester
10. januar 2006 - 11:33 #14
hehe, vi har tænkt det samme så Nielle :-)

// oUT
Avatar billede alex_sleiborg Nybegynder
10. januar 2006 - 11:36 #15
Hvordan kan jeg kalde det første objekt jeg opretter

Den ligger i en anden form, der hedder Connect_Pass.cs

public Connection connect;
private void open()
{
                    this.connect = new Connection();
                    this.connect.MdiParent = this.MdiParent;
                    this.connect.Show();
                    this.Close();
}
Jeg vil gerne kalde connect objektet, fra en anden klasse
Avatar billede Syska Mester
10. januar 2006 - 11:52 #16
Lav en Property eller lad Constructoren på den anden klasse tage imod en "Connection" klasse, så har du jo adgang til alt på dit Connection object, fra den anden klasse...

Skal ud af døren nu, men er tilbage om nogle timer hvis du ikke har fået det til at virke... og hvis, og du kunne bruge mit svar, kommer det bare her så :-) Håber det lykkes

// ouT
Avatar billede nielle Nybegynder
10. januar 2006 - 11:57 #17
Du kan måske også overveje om kommunikationen imellem de to MDI-childs skal gå via deres fælles parent.
Avatar billede alex_sleiborg Nybegynder
10. januar 2006 - 11:59 #18
Jeg har fået det til at virke, med en Property. Men har valgt at lave det lidt om, så at den bliver åbnet fra MDI containeren. Da jeg synes denne løsning er lidt mindre rodet. Smid et svar begge 2.

Og mange tak for hjælpen :)
Avatar billede alex_sleiborg Nybegynder
10. januar 2006 - 12:27 #19
Det virker hvis ikke helt alligevel...

Hvis jeg skal kommunikere igennem deres MDI parent, i stedet for direkte?

Har du evt. nogle eksempler
Avatar billede alex_sleiborg Nybegynder
10. januar 2006 - 13:01 #20
Den måde jeg har lavet min applikation på nu, så åbner jeg nye MDI child direkte fra andre childs. Måske var det smartere at man kaldte en metode eller noget fra MDI containeren. Så som du siger nielle, at man kommunikerer igennem containeren.

Men hvordan åbner jeg en ny MDI child, hvis den skal åbnes fra MDI containeren?
Avatar billede alex_sleiborg Nybegynder
10. januar 2006 - 13:04 #21
Har prøvet at lave en statisk metode i mdi containeren

Og så smide det her ind

open_connect opn = open_connect.Instance();
            opn.MdiParent = this;
            opn.Show();
            opn.Activate();

Men det duer heller ikke, jeg kan ikke bruge "this" i en statisk metode
Avatar billede Syska Mester
10. januar 2006 - 14:06 #22
Hvis du siger at du arbejder med din "Connection" klasse i en anden klasse... så synes jeg da det virker _utrolig_ nemt, at sende en reference med over.... simpelt......

Tror det er den løsnign du vil give gladest for.....

// ouT
Avatar billede alex_sleiborg Nybegynder
10. januar 2006 - 14:15 #23
Gider du lave et eksempel så. Jeg prøver lige at forklare lidt hvordan noget af min app fungerer

Main.cs          Er MDI Container
Connect_Pass.cs  Åbner Connection.cs som MDI Child, med Main.cs som parent
Connection.cs    Er den som jeg gerne vil have ændret lidt i, fra main.cs

I Connect_Pass.cs åbner jeg Connection.cs således

Connection con = new Connection();
                    con.MdiParent = this.MdiParent;
                    con.Show();

Så har jeg en eventhandler i Main.cs, hvor jeg gerne vil have ændret noget tekst i en label i connection.cs. Hvordan laver jeg sådan en reference?
Avatar billede Syska Mester
10. januar 2006 - 15:30 #24
*irkkkk*

Tjaa, jeg kan næsten forstå at der kun skal findes 1 stk af "Connection" klasse ( måske skal du lave navnet lidt mere specifikt, til dit program, kan godt forvirre )

I din Main.cs kunne du lave en Propery hvor du kan gemme din Connection klasse når den bliver oprettet....

Da Connect_Pass er Child til Main.cs kan du caste ( tror Propertien hedder Parent ) til den slags klasse det nu er, og så sætte:
((Form1)this.Parent).Connection = con;

Form1.ConnectionKlasse.Label.Text = "noget" i din eventhandler....

Intet er testet men sådan burde det kunne lade sig gøre i min hjerne... :-)

// ouT
Avatar billede nielle Nybegynder
10. januar 2006 - 18:01 #25
En anden mulighed, som ikke kræver at de to mdi-chield-forms kender hinanden, er at den ene form beder sin mdi-parent om at gennemløbe alle sine mdi-childs og så kalde  UpdateControl() for dem som er instanser af  Connection-klassen:

private void button1_Click(object sender, EventArgs e)
{
    foreach (Form form in ((ParentForm) this.MdiParent).MdiChildren)
    {
        if (form is Connection)
        {
            ((Connection) form).UpdateControl(true);
        }
    }
}
Avatar billede alex_sleiborg Nybegynder
11. januar 2006 - 08:55 #26
Jeg får denne fejl, når jeg bruger dit eksempel nielle

Error    2    'System.Windows.Forms.ContainerControl.ParentForm' is a 'property' but is used like a 'type'    C:\Documents and Settings\Administrator\Dokumenter\Visual Studio 2005\Projects\LoginSystem2005\LoginSystem2005\Main.cs    66    37    LoginSystem2005


buzzzz forstår ikke helt, hva du mener?
Avatar billede nielle Nybegynder
11. januar 2006 - 10:54 #27
I stedet for mit "ParentForm" skal du bruge det navn din egen mdi-parent form går under.
Avatar billede Syska Mester
11. januar 2006 - 12:53 #28
I din Main.cs kunne du lave en Property som hedder "Con" og som kan inde holde en Connection

Da Connect_Pass er Child til Main.cs kan du caste den til din MDI Parent klasse det nu er:
((MDIParentKlasse)this.Parent).Con = connnectionKlassen;

Sp kan du i din MDI Parent kalde
con.Label-I-ConnectionKlasse.Text = "noget";

Intet er testet men sådan burde det kunne lade sig gøre i min hjerne... :-)

Håber det blev lidt mere forståeligt nu, ellers må du gerne sige hvad du ikke forstår.....

// ouT
Avatar billede alex_sleiborg Nybegynder
11. januar 2006 - 13:52 #29
buzzzz den property hvordan vil du lave den? Connection er jo en klasse
Avatar billede Syska Mester
11. januar 2006 - 14:44 #30
på din MainForm:

private Connection con;
public Connection Con
{
    set { con = value; }
    get { return value; }
}
Avatar billede alex_sleiborg Nybegynder
11. januar 2006 - 14:55 #31
Jeg har sat dette ind i Main

private Connection con;
        public Connection Con
        {
            get { return con; }
            set { con = value; }
        }

Og dette i Connect_pass

((Main)this.MdiParent).Con = Connection;

Men jeg får denne compiler fejl

Error    3    Cannot implicitly convert type 'string' to 'LoginSystem2005.Connection'    C:\Documents and Settings\Administrator\Dokumenter\Visual Studio 2005\Projects\LoginSystem2005\LoginSystem2005\Connect_Pass.cs    72    50    LoginSystem2005

Til denne her linje
((Main)this.MdiParent).Con = Connection;
Avatar billede Syska Mester
11. januar 2006 - 16:33 #32
øhhh, hvad indeholder "Connection" i dit eksemple?

Virker som om at "Connection" er en string, og at den ikke kan convertere den, klart nok.......

Jeg er stadig imod at du bruger sådan nogle std navne... jeg kan ikke rigtig finde ud af om du henviser til klassen eller din instance af en klasse.....
Avatar billede Syska Mester
12. januar 2006 - 01:09 #33
Fået det til at virke?

// ouT
Avatar billede alex_sleiborg Nybegynder
12. januar 2006 - 16:16 #34
Nej det virker stadig ikke. Hvad er der galt i at jeg oprettede en ny winform, og kaldte den connection.cs?
Avatar billede Syska Mester
12. januar 2006 - 17:05 #35
Ikke noget specielt... bare svært for mig hele tiden at holde styr på hvad der er hvad, når du ikke skriver hvad Connection er... kunne vel lige så godt være en string.....

Da den netop siger at den ikke kan caste string til 'LoginSystem2005.Connection, virker det for mig som om din Connecetion i den her linje er en string og ikke af typen "LoginSystem2005.Connection"...
((Main)this.MdiParent).Con = Connection;

// ouT
Avatar billede nielle Nybegynder
12. januar 2006 - 17:38 #36
Har du fået prøvet mit forslag endnu?

private void button1_Click(object sender, EventArgs e)
{
    foreach (Form form in ((Main) this.MdiParent).MdiChildren)
    {
        if (form is Connection)
        {
            ((Connection) form).UpdateControl(true);
        }
    }
}
Avatar billede alex_sleiborg Nybegynder
12. januar 2006 - 17:42 #37
Ja så får jeg fejl under runtime

Object reference not set to an instance of an object.

i denne her linje

foreach (Form form in ((Main) this.MdiParent).MdiChildren)
Avatar billede nielle Nybegynder
12. januar 2006 - 20:44 #38
Det lyder jo som om at du ikke har sat this.MdiParent til noget?..
Avatar billede Syska Mester
13. januar 2006 - 00:02 #39
Du må komme med noget mere kode, vi sidder jo også gætter for at prøve at hjælpe dig.. og synes ikke rigtig du svarer tilbage når man spørger dig om noget.........

Jeg er træt, så jeg smutter nu, men skriv igen i morgen, vi skal nok få lortet til at virke...

// oT
Avatar billede alex_sleiborg Nybegynder
13. januar 2006 - 09:20 #40
Ja i får lige koden til Main.cs, i må jo sige til hvis i vil have mere kode

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

namespace LoginSystem2005
{
    public partial class Main : Form
    {
        public Main()
        {
            InitializeComponent();
        }

        private void Afslut_Click(object sender, EventArgs e)
        {
            Application.Exit();
        }

        private void Main_Load(object sender, EventArgs e)
        {
            open_connect opn = open_connect.Instance();
            opn.MdiParent = this;
            opn.Show();
            opn.Activate();
        }

        private void Åben_Forbindelse_Click(object sender, EventArgs e)
        {
            open_connect opn = open_connect.Instance();
            opn.MdiParent = this;
            opn.Show();
            opn.Activate();
        }

        private void Ny_Forbindelse_Click(object sender, EventArgs e)
        {
            string filename = string.Empty;//Streng der bruges for at tjekke om New_Connect.cs
            //skal oprette en ny forbindelse, eller redigere en forbindelse
            New_Connect nco = New_Connect.Instance();
            nco.MdiParent = this;
            nco.Show();
            nco.Activate();

        }
        public void MainEnabled(bool OnOff)
        {
            if (OnOff == true)
            {
                this.MainMenu.Enabled = true;
                this.tlb_MainMenu.Enabled = true;
            }
            else
            {
                this.MainMenu.Enabled = false;
                this.tlb_MainMenu.Enabled = false;
            } 
        }

        private void System_Stop_Click(object sender, EventArgs e)
        {
            //Når denne eventhandler bliver kørt, så skal der ændres tekst i en label i formen Connection.cs. Jeg har så lavet en metode som ligger i Connection.cs, specielt til det formål
        }
  }

Og her er min metode, som ligger i connection.cs
public void UpdateControl(bool StartStop)
        {
            if (StartStop == true)
            {
                this.lbl_ServerRunning.Text = "Kører";
                this.lbl_ServerRunning.ForeColor = System.Drawing.Color.Chartreuse;
            }
            else
            {
                this.lbl_ServerRunning.Text = "Stoppet";
                this.lbl_ServerRunning.ForeColor = System.Drawing.Color.Red;
                CloseSockets();
            }
            }
Avatar billede Syska Mester
13. januar 2006 - 10:21 #41
Jamen, der er jo hverken noget af mine eller hans kode med i det her.....

// ouT
Avatar billede alex_sleiborg Nybegynder
13. januar 2006 - 10:48 #42
Nej jeg har skrevet koden, som den så ud fra starten
Avatar billede nielle Nybegynder
13. januar 2006 - 12:37 #43
Et spørgsmål:

Er det fra parent-mdi-formen (altså en instans af Main-klassen) at du vil ændre en property i child-mdi-formen (altså en instans af Connection-klassen, eller er det måske klassen open_connect du mener?).

... eller er det fra en mdi-child til Main-instansen, at du ønsker at ændre en property i en anden mdi-chield-form?

Jeg har i hvert fald forstået problemet som det sidste.
Avatar billede Syska Mester
13. januar 2006 - 13:13 #44
Jeg har også forstået det som det sidste
Avatar billede alex_sleiborg Nybegynder
14. januar 2006 - 21:45 #45
Jeg vil ændre fra parent-mdi-formen (altså en instans af Main-klassen) ændre en property i child-mdi-formen (altså en instans af Connection-klassen)
Avatar billede nielle Nybegynder
15. januar 2006 - 08:24 #46
Ja, så har vi jo alle sammen unægteligt talt forbi hinanden.

Her er mit bud på en løsning:

private void button1_Click(object sender, EventArgs e)
{
    foreach (Form form in this.MdiChildren)
    {
        if (form is Connection)
        {
            ((Connection) form).UpdateControl(true);
        }
    }
}

Det kræver ikke at Main-instansen beholder en variabel som peger på dens childform-instans. Sådan en kan man også lave (men det overlader jeg til buzzzz ;^).
Avatar billede Syska Mester
16. januar 2006 - 20:59 #47
Der er mange muligheder, men nu har du i hvert fald fået vores foreslag....

// ouT
Avatar billede alex_sleiborg Nybegynder
16. januar 2006 - 21:29 #48
Jeg har fået det til at virke, med nielle's sidste forslag. Jeg siger rigtig mange tak, for jeres tålmodighed og hjælp. Og jeg undskylder, hvis jeg var lidt dårlig til at formulere mig
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