Avatar billede koppelgaard Praktikant
26. august 2010 - 10:18 Der er 3 kommentarer og
1 løsning

Kan ikke bringe form til front fra subtråd

Jeg har unden held forsøgt at sætte min form ifront efter at en subtråd har leveret nye data til den.

Jeg har lavet et lille testprojekt.
Under Form1_Load beder jeg en backgroundworker om
1) sætte formes venstre position. Det kan godt lade sig gøre.
2) kalde this.BringToFront. Det lykkes ikke.
Fejlmedelelse :

Cross-thread operation not valid: Control 'Form1' accessed from a thread other than the thread it was created on.


using System;
using System.ComponentModel;
using System.Windows.Forms;

namespace test
{
    public partial class Form1 : Form
    {
        delegate void FormLeftDelegate(int left);
        delegate void FormFrontDelegate(bool inFront);

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            backgroundWorker1.RunWorkerAsync();
        }
       
        private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
        {
            FormChange(10);
            FormChange(true);
        }

        void FormChange(int left)
        {
            if (this.InvokeRequired)
                this.Invoke(new FormLeftDelegate(FormChange), left);
            this.Left = left;
        }

        void FormChange(bool inFront)
        {
            if (this.InvokeRequired)
                this.Invoke(new FormFrontDelegate(FormChange), inFront);
            if (inFront)
                this.BringToFront();
            else
                this.SendToBack();

        }
    }
}
Avatar billede Spotgun Seniormester
26. august 2010 - 10:38 #1
Prøv det her i stedet (ikke testet):

        void FormChange(int left)
        {
            if (this.InvokeRequired)
                this.Invoke(new FormLeftDelegate(FormChange), left);
            else
                this.Left = left;
        }

        void FormChange(bool inFront)
        {
            if (this.InvokeRequired)
                this.Invoke(new FormFrontDelegate(FormChange), inFront);
            else
                if (inFront)
                    this.BringToFront();
                else
                    this.SendToBack();
        }
Avatar billede koppelgaard Praktikant
26. august 2010 - 10:57 #2
Super.
Det ser ud til at virke.
Else manglede.

Sender du svar?
Avatar billede Spotgun Seniormester
26. august 2010 - 11:00 #3
Præcis. Uden else sætningen har din Invoke jo ingen reel effekt. :)
Avatar billede Spotgun Seniormester
26. august 2010 - 11:00 #4
Præcis. Uden else sætningen har din Invoke jo ingen reel effekt. :)
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