Avatar billede droa Novice
01. juli 2009 - 15:59 Der er 5 kommentarer

Update et Form objekt, fra en anden classe?

jeg har oprette en ny classe, i samme namespace, som jeg har en funktion i, der gerne måtte kunne update en Label.Text, i min form, kan man gøre det?

invoke virker vel kun i samme classe? ellers kender jeg intet til invoke
Avatar billede arne_v Ekspert
01. juli 2009 - 16:03 #1
For at kalde en metode paa et objekt af en klasse skal du have en reference til objektet.

Hvis du skal opdatere en win form GUI fra en anden traad end event traaden skal du bruge invoke.
Avatar billede droa Novice
01. juli 2009 - 16:08 #2
form1


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

namespace Raider
{
    public partial class Form1 : Form
    {
        delegate void UpdateHandler(string s);

        void Update(string n)
        {
            toolStripStatusLabel1.Text = s;
        }

        public Form1()
        {
            InitializeComponent();

        }


        private void Form1_Load(object sender, EventArgs e)
        {

        }
    }
}



using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;

namespace Raider
{
    class downloader
    {
        public void download(string url,string fnm)
        {
            try
            {
                toolStripStatusLabel1.Invoke(new UpdateHandler(Update), new object[] { "Downloading: "+fnm });
            }
            catch
            {
                toolStripStatusLabel1.Invoke(new UpdateHandler(Update), new object[] { "Failed" });
            }
        }
    }
}



syntes slet ikke den kan genkende det man har skrevet
Avatar billede lasserasch Juniormester
01. juli 2009 - 16:52 #3
Man kan ikke rigtig se logikken i programmet synes jeg.

Kører det hele i en tråd eller flere?
Hvor er referencen til form1 som din downloader klasse kan bruge?

Hvis du ikke vil bruge for meget krudt på tråde, invoke osv, hvorfor bruger du så ikke en background worker. Den kan du starte fra din form. og så kan du jo koble dig op på det event som eksekverer når din download er færdig.

Det kører nemlig på den kaldende tråd og kan derfor opdatere din label.


Mvh.
Lasse
Avatar billede droa Novice
01. juli 2009 - 16:57 #4
der er heller ingen logik i programmet endnu, jeg har ingen ide om og lavet det jeg vil, og gidder ikke bruge arbejde på noget. før jeg finder ud af det.. ligenu er det ikke andet end bare at Downloader skal ændre toolStripStatusLabel1.Text
Avatar billede windcape Praktikant
01. juli 2009 - 22:38 #5
Istedet for at bruge et delegate kan du f.eks. gøre det således med lambda expressions:

Invoke((Action)(() =>
{
    toolStripStatusLabel1.Text = string.Format("Downloading {0}", fnm);
}
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