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

mfreak
mfreak (11.035 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 (158.951 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 (20.685 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 (11.035 point)
spændene jeg roder lige lidt med

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

mfreak
mfreak (11.035 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 (20.685 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 (11.035 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 (158.951 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 (11.035 point)
nielle vil du ikke have dine point?...

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

nielle
nielle (158.951 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

Custom datatyper i C#

Oprettet den 3. februar 2012 kl. 12.10
olehaahr giver 60 point for svar | Giv et svar »

Reportviewer med dynamisk dataset

Oprettet den 2. februar 2012 kl. 10.42
damaskinos giver 60 point for svar | Giv et svar »

Lytte på TCP port

Oprettet den 1. februar 2012 kl. 14.54
LennartH giver 150 point for svar | Giv et svar »

Seneste guides

Den gode bruger
Adgang til NAS-server via WAN
Kollektion af Batch tutorials (FJERNET)
Tilpas din YouTube afspiller


   




Tips & Tricks fra PC World

Teaser billede

Sådan fjerner du pladskrævende metadata fra dine fotos

Det er langt fra altid, at dine billeders metadata såsom kameramodel og geografisk placering er vigtige at bevare. JPG & PNG Stripper kan luge ud i billedfilerne, så de fylder meget mindre....


Anmeldelser fra PC World

Teaser billede

Test: Superlet bærbar med mange muligheder

Toshiba har med Satellite Z830 skabt en af verdens letteste ultrabooks. Den vejer 1,1 kilo, og computeren på 13 tommer ser på papiret ud til at være en oplagt rejsekammerat. Men den lave vægt har...


Seneste blogindlæg

Teaser billede

Tvangslukke spørgsmål: Hvad er den bedste løsning?

Hej Vi har mange åbne spørgsmål på Eksperten. Vi ville gerne tvangslukke dem - så et spørgsmål efter f.eks. 6 måneder lukkes. Men der er et par uklarheder som ville være gode at få lidt input til:...


Nyheder fra PC World

Teaser billede

Samsung Galaxy S III på vej

Samsungs bedst sælgende smartphone nogensinde får en efterfølger om kort tid.


Nyheder fra Computerworld

Teaser billede

Apple retter hele 51 sikkerhedshuller i Mac OS X

Apple lukker hele 51 sårbarheder i Mac OS X, hvoraf de fleste er kritiske. Se her, hvor hullerne er.


Kurser
Samarbejdspartnere

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