Laden...

Von BackgroundWorker auf TextBox zugreifen

Erstellt von Fastkiller vor 15 Jahren Letzter Beitrag vor 15 Jahren 4.267 Views
F
Fastkiller Themenstarter:in
47 Beiträge seit 2008
vor 15 Jahren
Von BackgroundWorker auf TextBox zugreifen

Hallo!

Ich habe da ein Problem.
Ich habe einen Button. Wenn ich auf diesen Button klicke verbindet sich das Programm zu einer Datenbank und gibt mir aus ob die Verbindung erfolgreich hergestellt wurde.
Das funktioniert soweit auch alles Prima, aber logischerweiße blockiert die GUI dadurch bis die Verbindung zur DB hergestellt wurde. Nun hab ich das Problem mit einem BackGroundWorker versucht zu lösen.
Hier mein Code:

        private void B_Login_Click(object sender, EventArgs e)
        {
            backgroundWorker1.RunWorkerAsync();
        }
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
        {
            MYSQL m1 = new MYSQL("db", "bla", "bla", "bla");

            if (m1.Init("LoginDaten"))
            {
                if (m1.CheckPassword(CB_User.Text, TB_Pass.Text))
                    MessageBox.Show("Verbindung erfolgreich hergestellt");
                else
                    if (m1.CheckUsername(CB_User.Text) == true)
                    {
                        CB_User.BackColor = Color.LimeGreen;
                        TB_Pass.BackColor = Color.IndianRed;
                    }
                    else
                    {
                        CB_User.BackColor = Color.IndianRed;
                        TB_Pass.BackColor = Color.IndianRed;
                    }
            }
            else
            {
                CB_User.BackColor = Color.IndianRed;
                TB_Pass.BackColor = Color.IndianRed;

            }
        }

Das Problem dabei ist allerdings, dass ich in der methode doWork() nicht auf die GUI Elemente zugreifen kann. Sprich wenn ich vor dem Methodenaufruf m1.Init("DB");

MessageBox.Show(TB_User.Text);

schreibe bricht das Programm sofort ab und wechselt in die RunworkerComplete Methode.
Wie könnte ich das Problem am besten lösen, sodass ich aus dem doWorker thread auf den text der TextBox zugreifen kann?

Danke schonmal!

mfg,
Fastkiller

G
497 Beiträge seit 2006
vor 15 Jahren

Zugriffe auf GUI-Controls IMMER nur im GUI-Thread. Siehe FAQ: [FAQ] Controls von Thread aktualisieren lassen (Control.Invoke)

F
Fastkiller Themenstarter:in
47 Beiträge seit 2008
vor 15 Jahren

Alles klar danke GarlandGreen, habs jetzt folgender maßen gelöst bzw "gesplittet":

        public void CheckLogin()
        {
            if (m1.Init())
            {
                this.Invoke(new MethodInvoker(DoCheapGuiAccess));
            }
            else
            {
                MessageBox.Show("ERROR");
            }
        }

        private void DoCheapGuiAccess()
        {
            if (m1.CheckPassword(CB_User.Text, TB_Pass.Text))
                MessageBox.Show("Login Erflogreich", "KMS", MessageBoxButtons.OK, MessageBoxIcon.Information);
            else
                if (m1.CheckUsername(CB_User.Text) == true)
                {
                    CB_User.BackColor = Color.LimeGreen;
                    TB_Pass.BackColor = Color.IndianRed;
                }
                else
                {
                    CB_User.BackColor = Color.IndianRed;
                    TB_Pass.BackColor = Color.IndianRed;
                }
        }

        private void B_Login_Click(object sender, EventArgs e)
        {
            new System.Threading.Thread(CheckLogin).Start();
        }

Funzt alles wunderbar 😃