Oprettet ons. d. 19. december 2007 kl. 17:50:05

mfreak
mfreak (8.290 point. Point ude: 230)

udskriv fra en form til en label i anden form

jeg er ved at lave en tekst editor:

jeg er har to forme

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

namespace Notepad_v1
{
    public partial class Forside : Form
    {
        public Forside()
        {
            InitializeComponent();
        }

        private void hentFraUnderSideToolStripMenuItem_Click(object sender, EventArgs e)
        {
            Underside GoToUnderside =new Underside();
            GoToUnderside.Show();
        }

     
     

       

     
    }
}

og
Underside:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.IO;

namespace Notepad_v1
{
    public partial class Underside : Form
    {
        string FileInfo;
        public Underside()
        {
           

            InitializeComponent();
        }

        private void but_opret_Click(object sender, EventArgs e)
        {
            using (StreamWriter sw = new StreamWriter(@"D:\Notepad txtfile\"+txt_underside.Text+".txt"))
            {
                FileInfo = (@"D:\Notepad txtfile\" + txt_underside.Text + ".txt");
                lab_underside.Text = FileInfo;
            }
        }

     


       

    }
}

Koder virker fint, men hvordan får jeg udskrever strengen FileInfo i formen Underside til en label i Formen Forside når jeg aktiver knappen?

Skrevet ons. d. 19. december 2007 kl. 18:49:56| #1

nielle
nielle (155.704 point)
Noget i denne stil:

namespace Notepad_v1
{
    public partial class Forside : Form
    {
        public Forside()
        {
            InitializeComponent();
        }

        private void hentFraUnderSideToolStripMenuItem_Click(object sender, EventArgs e)
        {
            Underside GoToUnderside =new Underside(this);
            GoToUnderside.Show();
        }     
    }
}

namespace Notepad_v1
{
    public partial class Underside : Form
    {
        string FileInfo;
    Forside parent;

        public Underside(Forside parent)
        {
        this.parent = parent;
            InitializeComponent();
        }

        private void but_opret_Click(object sender, EventArgs e)
        {
            using (StreamWriter sw = new StreamWriter(@"D:\Notepad txtfile\"+txt_underside.Text+".txt"))
            {
                FileInfo = (@"D:\Notepad txtfile\" + txt_underside.Text + ".txt");
                lab_underside.Text = FileInfo;

        parent.dinLavel.Text = FileInfo.FullName;
            }
        }
    }
}

Men så skal labelen også være erklæret internal.

Skrevet ons. d. 19. december 2007 kl. 18:51:45| #2

bvli
bvli (16.305 point)
Hej!

        private void hentFraUnderSideToolStripMenuItem_Click(object sender, EventArgs e)
        {
            Underside GoToUnderside =new Underside();
            Underside.FileInfoChanged += usFileInfoChanged;
            GoToUnderside.Show();
        }
        private void usFileInfoChanged(object sender, EventArgs e) {
            Underside us = sender as Underside;
            if (us != null) {
                this.FileInfoLabel.Text = us.FileInfo;
            }
        }

og i underside:

        private void but_opret_Click(object sender, EventArgs e)
        {
            using (StreamWriter sw = new StreamWriter(@"D:\Notepad txtfile\"+txt_underside.Text+".txt"))
            {
                FileInfo = (@"D:\Notepad txtfile\" + txt_underside.Text + ".txt");
                lab_underside.Text = FileInfo;
                this.fileInfo = FileInfo;
                OnFileInfoChanged(EventArgs.Empty);
            }
        }
       
        private string fileInfo;
        public string FileInfo {
            get {return fileInfo;}
        }

        public event EventHandler FileInfoChanged;

        protected virtual void OnFileInfoChanged(EventArgs e) {
            if (FileInfoChanged != null) {
                FileInfoChanged(this, e);
            }
        }

Skrevet ons. d. 19. december 2007 kl. 18:58:20| #3

mfreak
mfreak (8.290 point)
spændene jeg roder lige lidt med

Skrevet ons. d. 19. december 2007 kl. 19:28:16| #4

mfreak
mfreak (8.290 point)
nielle perfekt ;-) næsten rigtig kunne selv tilrette det sidste
Bvli fik en error hved compileringen med et parameter der allerede eksisterede og kan ikke helt hitte din kode.... men ellers tak for hjælpen

Skrevet tor. d. 20. december 2007 kl. 00:07:03| #5

bvli
bvli (16.305 point)
Men godt du fik det til at virker.

Det er jo et spørgsmål om stil. Vil du være objektorienteret og have en løs kobling mellem dine objekter, eller vil du lave dirty workarounds, og eksponere dine private variable :)

Jeg holder selvfølgelig på det første (hvor din underside intet som helst aner om din forside).

/B :)

Skrevet tor. d. 20. december 2007 kl. 07:02:19| #6

mfreak
mfreak (8.290 point)
bvli jeg er ikke så langt endnu indenfor programiring så til at starte skal det bare virke;-)

Skrevet tor. d. 20. december 2007 kl. 19:20:40| #7

nielle
nielle (155.704 point)
Nu er jeg altså stor tilhænger af princippet om at man skal lære at kravle før man kan gå før man kan løbe. Derfor har jeg ikke nogen problemer med at anbefale en quick'n'dirty løsning frem for den store forkromede. :^)

Når det så er sagt kan jeg ikke lade være med at lade mig provokere af antydningen om at min løsning ikke skulle være rigtigt objektorienteret. Specielt ikke da jeg ikke kan afvise det helt. ;^)

Anyways, der er intet i OOP som siger at to klasser med alle midler skal være så løst koblet som overhovedet muligt. Faktisk lægger den givne problemstilling efter min mening heller ikke op til det: da Underside-klassen ikke rigtig har nogen eksistens berettigelse uden at være kaldt direkte fra Forside-klassen, vil jeg endda sige at der som udgangspunkt allerede er lagt op til en rimelig stærk binding imellem dem. Og det er netop den slags at access-modifieren internal er tænkt til.

I en rigtig løsning ville jeg dog selv foretrække at lave det uden at gøre selve label'en internal; i stedet ville jeg definere en property og tilgå label'en via denne:

namespace Notepad_v1
{
    public partial class Forside : Form
    {
        public Forside()
        {
            InitializeComponent();
        }

        private void hentFraUnderSideToolStripMenuItem_Click(object sender, EventArgs e)
        {
            Underside GoToUnderside =new Underside();
            GoToUnderside.Show();
        }

        internal string FileFullName
        {
            get
            {
                return this.FileFullName.Text;
            }
            set
            {
                this.FileFullName.Text = value;
                // Her kan man samtidig placere anden logik
                // som har med det at vælge en ny fil at gøre
            }
        }
    }
}

namespace Notepad_v1
{
    private Forside parent;

    public partial class Underside : Form
    {
        string FileInfo;

        public Underside(Forside parent)
        {   
            InitializeComponent();

            this.parent = parent;
        }

        private void but_opret_Click(object sender, EventArgs e)
        {
            using (StreamWriter sw = new StreamWriter(@"D:\Notepad txtfile\"+txt_underside.Text+".txt"))
            {
                FileInfo = @"D:\Notepad txtfile\" + txt_underside.Text + ".txt";
                lab_underside.Text = FileInfo;

                parent.FileFullName = FileInfo.FullName;
            }
        }
    }
}

Eller rettere sagt:

Jeg ville nok foretrække at trække alle data som repræsentere den dims, som programmet skal arbejde på, ud som en helt selvstændig klasse. Adskille model og brugergrænseflade fra hinanden.

Bortset fra de overvejelser vil jeg give bvli ret i at teknikken med at bruge Events er vigtig at kende (ville dog definere min egen delegat specifikt til formålet). Jeg synes dog at den er en smule overkill her da der faktisk defacto ikke er tale om en meget løs binding mellem de to klasser.

PS: Jeg ville ikke selv bruge "FileInfo" som navnet på en streng på den måde der gøres i koden. Der findes allerede en klasse i System.IO med dette navn og der er ingen grund til at komme til at risikerer at komme til at blande de to ting sammen.

Skrevet tor. d. 27. december 2007 kl. 13:43:43| #8

mfreak
mfreak (8.290 point)
nielle vil du ikke have dine point?...

Skrevet tor. d. 27. december 2007 kl. 13:57:08| #9

nielle
nielle (155.704 point)
Jo da, jeg ventede egentlig bare på om der var nogen som havde kommentare til det jeg havde skrevet. :^)

... og et svar :^)

Skriv et indlæg




Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] [img]link til billede[/img]
Web- og emailadresser omdannes automatisk til links

Log ind

   

   

Seneste spørgsmål

add texbox til Panel

Oprettet den 31. juli 2010 kl. 16.34
mickni33 giver 30 point for svar | Giv et svar »

C# Get Hostname from ip

Oprettet den 30. juli 2010 kl. 18.38
mbm2007 giver 200 point for svar | Giv et svar »

Application i taskbar til højre som icon

Oprettet den 30. juli 2010 kl. 14.12
koppelgaard giver 30 point for svar | Giv et svar »

Seneste guides

100% højde med CSS i alle browsere
XML
Autocad / 3D Max / Revit til Salg.





Tips & Tricks fra PC World

Teaser billede

Sådan får du mest ud af batteriet på din bærbare

Batterierne i den bærbare lever sjældent op til forventningerne, men det er ikke altid batteriernes skyld. Se her hvordan du får mest muligt ud af dine batterier.


Anmeldelser fra PC World

Teaser billede

GTX460: Grafikkort med fin ydelse til rimelige penge

De store grafikkort løber med opmærksomheden, men det er i mellemklassen at de gode køb findes. Et af dem er det helt nye Nvidia GTX460. Se kortets resultater her.


Seneste blogindlæg

Teaser billede

Nu kan du slettes

Det sker af og til at en bruger ønsker at slette sin profil her på Eksperten. Det har vi haft svært ved, men nu kan du gøre det nemt og enkelt. Alt du skal gøre er at logge ind, gå ind på...


Nyheder fra PC World

Teaser billede

Test: Stream nye spil til gamle computere

Det er slut med at investere tusindvis af kroner i dyr hardware for at kunne spille de nyeste spil - amerikansk firma lader stor serverfarm klare arbejdet og streamer spillene til dig via nettet....


Nyheder fra Computerworld

Teaser billede

Test din viden med Computerworlds store sommerquiz

4. del: Brug agurketiden til at få opdateret din viden om it-branchen, og test for sjov om kollegerne på ferie eller derhjemme er lige så skarpe. Computerworld quizzer hver uge hele sommeren.



Kurser
Samarbejdspartnere

Udgiver · © 2010 IDG Danmark A/S · Hørkær 18 · 2730 Herlev · Tlf.: 77 300 300 · Fax: 77 300 301