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.
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 :-)
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
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
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.
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?
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.....
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?
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... :-)
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); } } }
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
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;
ø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.....
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;
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...
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 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();
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(); } }
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.
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 ;^).
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
Synes godt om
Ny brugerNybegynder
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.