Avatar billede bandersen2200 Nybegynder
07. december 2011 - 17:25 Der er 7 kommentarer og
1 løsning

Thread skal hente data fra klasse i anden fil

Hej

Jeg har følgende 2 klasser i 2 forskellige filer: public partial class Form1 : Form & public class Test3

I Test3 kører en thread: PROTestThread(object StartObj) Den thread vil gerne have til at kunne tilgå værdierne i Form1 og kunne opdate textboxen i Form1 GUI.

#1. Hvordan tilgår jeg værdien public static string sTest1; fra klassen Form1 med et kald fra klassen Test3 ?

#2. Hvordan opdatere jeg en textbox fra min thread i Test3 på Form1 ?

Program.cs
namespace PROTest_GUI
{
    //public partial class Form1 : Form
    public partial class Form1 : Form
    {
        #region Init
        public static string sTest1;
        public static string sTest2;
        public static string sTest3_DV;
        public static string sTest3_PU;
        public static string sTest4;
        public static string sTest5;
        public static string sStation;
        bool bOenXLSbtn = false;
        bool bUpdateText = false;

        public delegate void UpdateTextCallBack(string text);
        Thread thread;

        #endregion

        public Form1()
        {
            InitializeComponent();
        }

       
        private void btnStart_Click(object sender, EventArgs e)
        {
            Test3 fu = new Test3();
            thread = new Thread(fu.PROTestThread);
            thread.IsBackground = true;
            thread.Start();
         
        }
}
}
Test3.cs
namespace PROTest_GUI
{
    public class Test3
    {
        public void PROTestThread(object StartObj)
        {
            Form1 F1 = new Form1();
           
            MessageBox.Show("Inside Thread F1: ");

            //Does not work
            Thread.Sleep(1000);
            F1.textOutput.Text = "Inside thread";         
        }
    }
}
Avatar billede arne_v Ekspert
07. december 2011 - 17:52 #1
Test3's constructor skal have et argument af typen PROTest_GUI som gemmes i et private field og saa skal den kaldes med this.

Saa kan det field bruges til at tilgaa formen.
Avatar billede arne_v Ekspert
07. december 2011 - 17:53 #2
Og formen skal nok opdateres med Invoke for at undgaa cross thread exception.
Avatar billede bandersen2200 Nybegynder
08. december 2011 - 09:18 #3
Hej

Tak for hjælpen jeg kan nu tilgå de global variable i klassen på følgende måde:

public void PROTestThread(object StartObj)
        {   
            MessageBox.Show("Inside Thread F1: ");
            MessageBox.Show("sTest1: " +                  PROTest_GUI.Form1.sTest1.ToString());
           
        }
Men jeg forstår ikke helt hvordan jeg skal bruge this. ? For at tilgå textboxen i Form1 ?
Avatar billede bandersen2200 Nybegynder
08. december 2011 - 09:22 #4
Jeg har tidligere brugt følgende for at opdatere textboxen fra en tråd. Men når det er i en anden klasse kender klassen ikke textboxen textOutput.

Thread.Sleep(1000);
            textOutput.BeginInvoke(new UpdateTextCallBack(UpdateText), new object[] { text });
Avatar billede bandersen2200 Nybegynder
08. december 2011 - 15:34 #5
Hej Fik det til at virke brugte følgende link:

http://www.dreamincode.net/forums/topic/58171-access-form-class-textbox-from-other-class/

Løsning:
Update Textbox in GUI on Form1 from other Thread in another class and file

Program.cs
namespace GUIThread
{
    public partial class Form1 : Form
    {
        Thread thread;

        Perl2 frm = new Perl2();   
       

        public Form1()
        {
            InitializeComponent();           
            frm.ShowForm(this);
            new Thread(frm.SampleFunction).Start();
        }

        public void AppendTextBox(string value)
        {
            if (InvokeRequired)
            {
                this.Invoke(new Action<string>(AppendTextBox), new object[] { value });
                return;
            }
            textBox1.Text += value;
        }       
   
        private void textBox1_TextChanged(object sender, EventArgs e)
        {

        } 
    }
}


File: Class1.cs
namespace GUIThread
{
    class Perl2
    {
        Form1 _frm;

        public void SampleFunction()
        {
            _frm.AppendTextBox("jo jo jo");
        }
        public void ShowForm(Form1 frm)
        {

            _frm = frm;

            //this.Show();
            this._frm.Show();
           
        }
    }
}

Men Arne du skal vist have point for hjælpen :)
Avatar billede Syska Mester
08. december 2011 - 15:49 #6
Overstående er jo også hvad Arne_v forslog uden dog at skrive koden for dig.
Avatar billede bandersen2200 Nybegynder
04. januar 2012 - 15:43 #7
Hej Arne_v

Vil du have dine point så jeg kan få tråden lukket ?
Avatar billede arne_v Ekspert
04. januar 2012 - 16:12 #8
ok
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