Avatar billede mfreak Nybegynder
19. december 2007 - 17:50 Der er 8 kommentarer og
1 løsning

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?
Avatar billede nielle Nybegynder
19. december 2007 - 18:49 #1
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.
Avatar billede bvli Praktikant
19. december 2007 - 18:51 #2
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);
            }
        }
Avatar billede mfreak Nybegynder
19. december 2007 - 18:58 #3
spændene jeg roder lige lidt med
Avatar billede mfreak Nybegynder
19. december 2007 - 19:28 #4
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
Avatar billede bvli Praktikant
20. december 2007 - 00:07 #5
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 :)
Avatar billede mfreak Nybegynder
20. december 2007 - 07:02 #6
bvli jeg er ikke så langt endnu indenfor programiring så til at starte skal det bare virke;-)
Avatar billede nielle Nybegynder
20. december 2007 - 19:20 #7
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.
Avatar billede mfreak Nybegynder
27. december 2007 - 13:43 #8
nielle vil du ikke have dine point?...
Avatar billede nielle Nybegynder
27. december 2007 - 13:57 #9
Jo da, jeg ventede egentlig bare på om der var nogen som havde kommentare til det jeg havde skrevet. :^)

... og et svar :^)
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